Skip to content

fsynthlib/fsynth

Folders and files

NameName
Last commit message
Last commit date
Aug 28, 2020
Sep 29, 2020
Mar 14, 2021
Feb 15, 2021
Mar 14, 2021
Aug 19, 2020
Apr 6, 2021
May 30, 2020
Jan 16, 2019
Apr 21, 2021
Feb 26, 2021
Aug 19, 2020
Aug 19, 2020
Mar 21, 2020
Aug 29, 2020

Repository files navigation

Build Status codecov Awesome Kotlin Badge

What is fsynth?

It's a simple music synthesizer. It focuses on generating the waveforms from scratch, no samples are used. You can listen to it via the Web player, or using the cross-platform Java CLI. Read on to learn more.

Secondly, this project is my playground for learning Kotlin, functional programming (hence the "f" in "fsynth"), front-end development, Gradle, multiplatform projects, and other. It's also a place where I can focus more on quality than I normally could afford in a professional environment, because here I don't have a pressure to deliver on time. That's why my aim here is also to have as little technical debt as possible, and have as clean code as I can write.

Songs are described with such DSL:

val simpleDemoSong = song(
        name = "Simple demo song",
        beatsPerMinute = 120) {
    track(instrument = organs, volume = 0.3f) {
        note(1 by 8, D4)
        note(1 by 16, Csharp4)
        note(1 by 16, D4)
        note(1 by 8, E4)
        note(1 by 8, D4)

        pause(1 by 8)
        chord(1 by 8, A3, D4, Fsharp4)
        chord(1 by 4, B3, D4, G4)
    }
}

How to listen

Web

https://fsynthlib.github.io/fsynth/

Java CLI

The CLI uses system sound output to play music.

You can use the CLI from the distribution package:

./gradlew :cli:installDist
cli/build/install/fsynth/bin/fsynth --song 'Van Halen - Jump (intro)'

or during development, you can call the CLI through Gradle:

./gradlew :cli:run --args="--song 'Van Halen - Jump (intro)'"

To see a list of available songs, call the CLI without arguments.

[TKUG #1] Piotr Krzemiński, 'Project fsynth: show and tell'

Build prerequisites

The below dependencies won't be installed by Gradle:

  • JDK + path to it in JAVA_HOME (warning: use Oracle's JDK for now, there are some issue with OpenJDK; see #31 for details)
  • Android SDK + path to it in ANDROID_HOME