• Stars
    star
    114
  • Rank 308,031 (Top 7 %)
  • Language
    TypeScript
  • License
    GNU Affero Genera...
  • Created almost 3 years ago
  • Updated 6 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

JSS-01 | JavaScript Software Synthesizer

Note: The JavaScript Software Synthesizer is in active devleopment and its currently being refactored/redesigned, thus some of the features might not work as intended. For the latest stable version please visit this repository.

JSS-01 Logo JSS-01 Logo

JSS-01
JavaScript Software Synthesizer

made-with-typescript MIT license Version

Buy Me a Coffee at ko-fi.com

Technologies Used

                                         

More info about the technologies can be found here.

Description

The JSS-01 | JavaScript Software Synthesizer is a web application enabling you to make and play music in the browser. It is a software synthesizer utilizing the Web Audio API by implementing a variety of JavaScript frameworks and libraries, such as Tone.js and NexusUI2. Its design is fully modular, thus it can easily be adapted and integrated into any kind of project.

My aim when creating the JSS-01 was to offer a powerful synthesizer that is simple, easy and, above all, fun to use!

More screenshots can be found here.

Build & Run

First clone the project from GitHub:

git clone [email protected]:michaelkolesidis/javascript-software-synthesizer.git
cd javascript-software-synthesizer

Install the project dependencies:

yarn

Start the Vite development server:

yarn dev

For versions 1.x.x

Before the introduction of Vite in version 2.0.0, after installing the dependencies, users could run JavaScript Software Synthesizer locally by using a VSCode extension like Live Server (Live Server on the Visual Studio Marketplace) or Python's http.server module.

For more information, please refer to MDN's excellent article: MDN article

Demo

There is an online demo available at https://javascript-software-synthesizer.vercel.app/

Introduction

Keys, knobs, sliders and buttons to tweak your sound and generate immersive soundscapes. You can also connect your MIDI keyboard and play with it!

Quick Start

The JSS-01 | JavaScript Software Synthesizer uses FM Synthesis (frequency modulation synthesis). In FM Synthesis there is an oscillator that produces the sound signal, the Carrier, and an oscillator that modulates the carrier's wave frequency, the Modulator.

Sine wave:

Frequency-modulated sine wave:



In JSS-01, the Synth Section of the synthesizer includes the controls for the Carrier oscillator.



The Modulation Section includes the controls for the Modulator oscillator.



The Effects Section includes the controls of the various effects that can be applied to the sound. The effects are connected in series with the following connectivity: Oscillator 2 --> Oscillator 1 --> Auto Filter --> Phaser --> Crusher --> Chebyshev --> Feedback Delay --> Ping Pong Delay --> Reverb --> Chorus --> Tremolo --> Vibrato --> Distortion --> Frequency Shifter --> Output.

How to Play

You can play the JSS-01 by using the on-screen keyboard, your computer keyboard, or a MIDI keyboard.

Oscilloscope

The Oscilloscope shows the waveform of the sound. You can click on it to pause or you can right-click on it to save the current waveform as an image.

Modulation Index

The Modulation Index determines the amount of the modulation that will be applied to the Carrier. If you set the Modulation Index to 0 (can be found at the top line of the Synth section) you get the unmodulated output of the carrier oscillator.

MIDI

In order to use your MIDI keyboard with the JSS-01 you should connect it and turn it on, prior to accessing the web app. If you connect it while already on the JSS-01, you should refresh the page. The available MIDI devices will appear inside the MIDI display, located on top left. You can click on the MIDI device you would like to use and wait for the confirmation message. You are now ready to use your MIDI keyboard. Enjoy playing!

Sequencer

Right above the on-screen keyboard you can find the Sequencer. There is an included sequence preinstalled, so you can just press the Play button and listen to it.

The first input from the left controls the rate of the sequence (speed). The second input is the base value of the notes of the sequence (16n stands for a 16th note value, 8n for an 8th and so on). You can input your own sequences in the main input by writing the sequence of the desired notes in this form: "C4", "F5", "D2"**. You can include parts with notes of half the base value by including them in brackets, ex. "C4", ["F5", "D2"]. In these examples, if the base value is 16n (16th notes), C4 will have a value of 16th, and each of the F5 and D2 will have a value of 32th (or a value of a 16th combined).

When your sequence is ready, you can add it to the sequencer using the Add button. In order to go back to the default sequence, you can simply write default in the sequence input field and then click the Add button. There are two extra sequences included, the bassline of "I Feel Love" by Donna Summer (produced by Giorgio Moroder), which can be accessed by writing i feel love in the sequence input field and then pressing the add button, and the riff of "Funky Town", that can be accessed by writing funky town.

You can find some additional information about the JSS-01 and sound synthesis in this short presentation.

System Requirements

The JSS-01 | JavaScript Software Synthesizer is quite heavy, especially on the CPU. We would suggest these indicative minimum requirements:

Component Minimum Recommended
CPU Quad-core x86-64 (2014 or later) Quad-core x86-64 (2018 or later) or M1
RAM 8GB 16GB
Display 1600x900 1920X1080
Sound Card On-board, dedicated, or audio interface Audio interface
Speakers Monitor speakers or mixing headphones Monitor speakers or mixing headphones

Browser Requirements

Browser
Chrome or other Chromium-based browsers
Safari
Firefox with the MIDI Input Provider add-on

Documentation

Full documentation will be released at some point in the future. In the meantime, you can refer to the Tone.js documentation, as well as the NexusUI2 documentation.

Guides & Tutorials

The JSS-01 is using FM synthesis implementing the FMSynth of Tone.js, While there aren't any guides and tutorials specifically for the JSS-01 yet, there are plenty of excellent guides on FM synthesis:

FM Synthesis

Contributing

Feel free to submit issues and pull requests. It would be great to create a community around JSS-01, to continue its development and evolution, making it more capable and easier to use, increasing its creative and artistic potential. If you are interested in becoming part of out community it would be useful to have a look to our dedicated document regarding Contributing, as well as, out Code of Conduct. In a nutshell, we want our community to be a safe space for everyone, so that we can all have a pleasant and joyful experience!

Changelog

Please refer to the project's Changelog document.

Technologies Used (Extended)

  • Tone.js
    One could say that Tone.js is the "soul" of our project. It provides us with the synthesizers we use to generate sounds, as well as their various properties that can be tweaked and adjusted.
  • NexusUI2
    NexusUI2 provides us with the UI components that are connected to the synthesizers and make parameters adjusting easy and playful.
  • WEBMIDI.js
    WEBMIDI.js makes Web MIDI API easy to implement. It allows users to connect their MIDI keyboards and play the synthesizer the way it is meant to be played. Because, who likes playing music with a mouse?
  • Sass
    The SCSS (Sassy CSS) syntax is utilized for the styling of our project.
  • TypeScript
    In version 0.6.1, TypeScript was first introduced in the project, with significant parts of it migrating to TypeScript for increased type safety. In version 1.0.0 migration to TypeScript was completed.
  • Vite
    Vite provides the frontend tooling, a local server and packaging

Roadmap

Completed

  • Dark Mode. Users are now able to switch the UI to dark mode. Dark mode makes the whole experience easier on the eyes and greatly improves readability and accessibility for certain users. It was one of the most common feature requests we were getting as feedback from our users.
  • Migration to TypeScrip

Currently Working On

  • Bug fixes

Future Plans

Some of the features to be implemented in the future are:

  • Recorder
  • Presets
  • All parameters controllable with MIDI
  • Other types of sound synthesis to choose from (currently only FM synthesis)
  • Rewriting the app using React

References and Inspiration

A full(-ish) list of references can be found in the References document.

Screenshots

Medium Screens

Small Screens

Contributors

Your name could be here and it would be great to have you aboard!

Other

  • You can find a mirror of this repository in Codeberg.
  • The project has a total of 3,342 lines of code (excluding blank lines and comments).

Special Thanks To

  • Mohammed Amine Grid, for his guidance and dedication throughout this journey.
  • All the students and the tutors at the Social Hackers Academy, for creating a nice little community of passionate people offering their best for each other.

💖 Support the Project

Thank you so much for your interest in my project! If you want to go a step further and support my work, buy me a coffee:

Buy Me a Coffee at ko-fi.com

License

Copyright (c) 2023 Michael Kolesidis
Licensed under the GNU Affero General Public License v3.0.


More Repositories

1

learnc

Educational material and examples for those interested in learning the C programming language
C
23
star
2

michaelkolesidis.com

My award-winning portfolio website / playground
TypeScript
22
star
3

emoji-minesweeper

Minesweeper made with emoji. The most fun way to play minesweeper! 😄
JavaScript
20
star
4

beachy-beachy-ball

A beach ball adventure! Can you make it to the end?
JavaScript
18
star
5

scratch-bonanza

An online scratchcard (instant lottery) game. Do you feel lucky?
TypeScript
16
star
6

rock-paper-scissors-3d

The classic game of rock, paper, scissors in 3D!
JavaScript
16
star
7

dragons_dice_roller

Dragon's Dice Roller is the first and (so far the only) open source RPG dice roller written in C available on GitHub. It aims to be a lightweight, simple, reliable and easy-to-use dice roller for any kind of role-playing game.
C
15
star
8

interwoven-oversemantization

A circle created by random lines. Made with p5.js
JavaScript
14
star
9

cherry-charm

An online 3D slot machine game.
TypeScript
13
star
10

terminal-online

A webpage styled like a terminal window using HTML & CSS. Exact replica of my iTerm2 configuration.
HTML
12
star
11

3d-cube-processing

A 3D cube rotating according to mouse movement
Processing
12
star
12

solar-system-2d-with-moons

Processing
12
star
13

minimal-online-text-editor

Ephemeral texts. No features.
HTML
12
star
14

electronic-drum-kit

An Electronic Drumkit that can be used with mouse or keyboard.
JavaScript
11
star
15

random-line-art-circle-video

A circle created by random lines. Line color determined by camera input.
Processing
11
star
16

image-explode-3d

Image explodes according to mouse movement.
Processing
11
star
17

calculator

CSS
10
star
18

3d-rotating-cubes

A small 3D cube rotating by itself and a large 3D cube whose rotation is controlled by mouse.
Processing
10
star
19

cubesphere

A cube rotating according to mouse movement placed inside a self-rotating sphere.
Processing
10
star
20

solar-system-3d

Processing
10
star
21

snake-array

The cursor shadow created a snake-like effect.
Processing
10
star
22

existential-clock

Processing
10
star
23

octabbit-rpg

Octabbit will be an RPG game, featuring a rabbit with octopus-like tentacles.
Processing
10
star
24

pong-processing

Pong game created with Processing
Processing
10
star
25

random-line-art

Processing
10
star
26

monsters-in-space

Monsters moving through space. Click mouse for stars.
Processing
10
star
27

ecosystem

A simple ecosystem of amoebas and bubbles.
Processing
10
star
28

background-remove

Takes live input from camera, removes the background and displays your background of choice.
Processing
10
star
29

balloon-rescue

Rescue the balloons from touching the spikes.
Processing
10
star
30

tictactoe-processing

A simple Tic-Tac-Toe game created with Processing.
Processing
10
star
31

circles-intersect-noise

Intersecting circles that produce noise and colors.
Processing
10
star
32

random-line-art-circle

A circle created by random lines.
Processing
10
star
33

drum-kit-reworked

An Electronic Drum Kit controlled with keys.
HTML
10
star
34

move-square

A simple SVG example featuring a movable square.
TypeScript
10
star
35

dom-window-manager

A simple window manager for DOM elements
TypeScript
10
star
36

javascript-examples

Educational material and examples for those interested in learning JavaScript
TypeScript
9
star
37

programming-principles-and-practice-using-cpp-solutions

My solution to some of the exercises from Bjarne Stroustrup's book "Programming : Principles and Practice Using C++"
C++
9
star
38

character-movement-theejs

An example of basic character and camera movement in Three.js.
JavaScript
9
star
39

made-with-linux

A collection of Made with Linux stickers/badges for your projects
8
star
40

tech-icons

A collection of icons of various technologies
7
star
41

react-landmarks

TypeScript
6
star
42

bird-generator

A Bird Generatorâ„¢ made with p5.js. Bird, lights, go!
JavaScript
6
star
43

timberland-3d-customizer

TypeScript
6
star
44

javascript-software-synthesizer-classic

JSS-01C | JavaScript Software Synthesizer Classic | The original version of the JavaScript Software Synthesizer before the ongoing refactoring/redesign.
TypeScript
6
star
45

perlin-landscape

Landscape created dynamically using Perlin noise.
JavaScript
6
star
46

mouse-jiggler

Simple mouse jiggler to keep your computer from sleeping.
Shell
5
star
47

teddy-3d

A 3D Teddy Bear
JavaScript
5
star
48

chompy-o-croc

Run and jump around platforms, collecting stars, chomping on delicious food, and avoiding bombs!
TypeScript
5
star
49

uncanny-canyon

An interactive 3D web experience, featured in Athens Digital Arts Festival 2023 in the Web Art category.
JavaScript
4
star
50

particircle

A circle of particles
JavaScript
4
star
51

hangman

The popular game of hangman, created with Java, demonstrating the object-oriented programming paradigm.
Java
4
star
52

scratch-bonanza-server

The server of Scratch Bonanza, an instant lottery game.
TypeScript
4
star
53

dom-window-manager-demo

A demonstration of DOM Window Manager.
JavaScript
4
star
54

3d-cube

A 3D cube rotating according to mouse movement.
JavaScript
3
star
55

sticky-notes

Fill your screen with sticky notes of various colors.
TypeScript
3
star
56

synthetique

Retrofuturistic demo
JavaScript
3
star
57

learnperl

Educational material and examples for those interested in learning Perl.
Perl
3
star
58

processing-examples

Processing examples and excercises
Processing
3
star
59

learnjava

Educational material and examples for those interested in learning Java.
Java
3
star
60

camelnotes

A simple note-taking web application in React
JavaScript
3
star
61

pomonodeoro

A simple pomodoro timer for the terminal
JavaScript
3
star
62

text-3d

JavaScript
3
star
63

tic-tac-toe

Tic-tac-toe in vanilla JavaScript
JavaScript
3
star
64

tenzi

Tenzi is a dice game. The player needs to roll dice until they are all the same. Clicking on a dice, freezes it at its current value between rolls. Best scores are saved to local storage.
TypeScript
3
star
65

library-project

JavaScript
2
star
66

colorful-cubes

JavaScript
2
star
67

mikes-homepage

HTML
2
star
68

laser-cat-libre

A cat that shoots lasers at things you want to remove from the internet.
HTML
2
star
69

nuclear-power-no-thanks

The Nuclear Power? No Thanks logo
2
star
70

shadertoy-shaders

A collection of my shaders in Shadertoy.
GLSL
2
star
71

music-reviews

A basic music reviews web application prototype.
TypeScript
2
star
72

learning-ruby

Ruby
2
star
73

css-3d

A simple website showcasing CSS 3D examples and how they work.
HTML
2
star
74

collection-of-div-surrogates

A piece of web art.
JavaScript
2
star
75

webproject-scripts

A collection of simple shell scripts for working with webprojects.
Shell
2
star
76

project-olympics

An animation-abundant responsive website showing the results of the 100m women's finals in the Tokyo 2020 Olympicsâ„¢.
HTML
2
star
77

fragment-shaders

GLSL
2
star
78

fintech-world

An immersive 3D gamification web platform that promotes, educates, and informs visitors about digital payment solutions, through a fun and engaging experience.
JavaScript
2
star
79

random-triangles-cube

Random triangles form a cube. Made with three.js.
JavaScript
2
star
80

japanese-restaurant

A website for a Japanese restaurant.
JavaScript
2
star
81

learngo

Educational material and examples for those interested in learning the Go programming language.
Go
2
star
82

microblog

Tiny microblogging library
JavaScript
2
star
83

scribble-text

Text gradually appears whilte scribbling.
JavaScript
2
star
84

cosmic-apotheosis

Experiment using SVG and Sass.
TypeScript
2
star
85

sports-app-pwa

JavaScript
2
star
86

fractal-mountain

A single triangle transforms into a mountain.
JavaScript
2
star
87

infinite-triangle

Experiment using SVG and Sass.
JavaScript
2
star
88

learn-elixir

Educational material and examples to learn Elixir
1
star
89

turntable

HTML
1
star
90

p5js-experiments

A collection of my p5.js experiments
TypeScript
1
star
91

cuberabbit

The story of a cube-shaped rabbit.
TypeScript
1
star
92

michaelkolesidis

1
star
93

emoji-minesweeper-android

1
star
94

flamingos

Breathing new life into the flamingos
JavaScript
1
star
95

vat-calculator

Calculate prices with or without VAT
JavaScript
1
star
96

material-widgets

A collection of material widgets.
TypeScript
1
star
97

minimal-portfolio

A minimal, dead-easy portfolio website template
1
star
98

maneki-neko

HTML
1
star
99

nexusui2

NexusUI2: Typed Web Audio Interfaces
JavaScript
1
star
100

fart

A farting butt.
CSS
1
star