• Stars
    star
    160
  • Rank 233,330 (Top 5 %)
  • Language
    JavaScript
  • Created almost 9 years ago
  • Updated over 3 years ago

Reviews

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

Repository Details

A JavaScript emulator of the legendary EMS Synthi A synthesizer.

SYNTHI-JS

SYNTHI-JS is an emulator of the legendary EMS Synthi A modular synthesizer, built in JavaScript on top of the Flocking library.

>>> TRY IT ONLINE <<<

Screenshot of SYNTHI-JS

Features

  • Devices
    • 3 oscillators
    • noise generator
    • low-pass filter
    • ring modulator
    • analog-style reverberator
    • self-triggering envelope generator
  • 16x16 control patchboard
  • Bidirectional joystick controller
  • Scope module displaying "voltage" over time
  • 100 patch memory banks with import/export functionality and (new in v1.1!) 5 built-in presets
  • (new in v1.2!) File upload functionality for input sources via S3
  • (new in v1.2!) Customizable knob behavior
  • (new in v1.3!) Emulation of the EMS DK2 keyboard

Getting Started

First, open up SYNTHI-JS and take a look around.

SYNTHI-JS can look daunting at first, but creating patches with it is actually quite straightforward. The patchboard functions as a routing mechanism: device outputs on the left side of the patchboard get routed to device inputs on the top side of the patchboard.

Let's make our first patch! Click on the button at B1 at the patchboard to connect the sine-wave output of Oscillator 1 to Output Channel 1. You should hear a 440 Hz sine wave coming out of your left speaker – congratulations!

We can now try messing around with it a little. Try plugging the oscillator first into another component - perhaps the filter or the reverb module, and then try plugging that into an output channel (for example, G1 and B14). Try turning some knobs to alter the sound. Or perhaps try mixing two oscillator together into the ring modulator and outputting the result (E1, F3, B13). Try turning some knobs and see how it affects the output.

In addition to hooking up your final output to the Output Channels (columns B and C), you can also hook it up to the Scope (column A) to be able to observe the waveform. The scope is a great tool for debugging issues in your patch.

Now that you have a sense of how the patchboard works, try loading some presets to get a feel for what this thing can do. The presets are currently stored in memory banks 00-04 (and indicated with a P). Note that preset 02 only produces sound when you touch the joystick control.

Another neat way to get started is to upload your own audio tracks to use as input sources. Use the Input Sources panel to upload tracks and (optionally) specify which segments of them you want to work with. Now, you can use the Input Channel pins on the patchboard (rows 8 and 9) as an input source. Try running your tracks through different devices and see what happens.

To learn more, read the SYNTHI-JS manual by clicking the ? button near the patchboard.

Development

SYNTHI-JS is completely client-side and requires no build process. Simply clone the repo, open index.html in your browser (Chrome 45+ recommended), and get started!

I do admit that importing dozens of separate JavaScript files is not the best use of resources. Sometime soon I'd like make a simple build script to concatenate and minify them to speed up load times.

To-Do / Wish List

My goal is to make as faithful a reproduction of the Synthi A as possible, but there have been features of it that I have been unable to reproduce, whether because of conceptual difficulties or just lack of time. Here are the ones that I know of at the moment:

  • The ability to have circular chains of component dependencies (for example, A depends on B and B depends on A). As far as I can tell, this is not possible in Flocking, but I'm open to suggestions.
  • An emulation of the EMS KS sequencer.
  • In general, many of the components of SYNTHI-JS don't follow the specs as well as they could. As I don't personally have a Synthi A to test, I've been doing the best I could from videos and spec sheets. All feedback is much appreciated.

It would also be great to fix or reduce the audio buzz that happens while turning knobs or otherwise controlling the UI, but I haven't been able to do anything about it. Perhaps it's a browser limitation?

Acknowledgements

SYNTHI-JS was created by Alex Nisnevich.

I'd like to thank:

  • Colin Clark, without whose Flocking library this wouldn't be possible.
  • the Vintage Synth Museum in Oakland, for showing me my first Synthi A, and Sasha for taking me there.
  • Jacob Nisnevich, for helping me make the UI look nice.
  • My beta testers: Greg, Matt, Kyan, Joseph, Tyler, Dmitry, Michael, did I miss anyone?

More Repositories

1

untrusted

A meta-JavaScript adventure game by Alex Nisnevich and Greg Shuflin.
JavaScript
4,571
star
2

ECMAchine

Lisp-based in-browser toy operating system
JavaScript
189
star
3

sentinel

USB rocket launcher + webcam + face tracking = sentinel.py
Python
55
star
4

melody.py

Brute-force generation of ten-note cantus firmus melodies and first species counterpoint
Python
31
star
5

kalevala

Multiplayer tile-laying board game in Elm
Elm
19
star
6

Portfolio

JSON-driven portfolio site with pretty circles
HTML
10
star
7

dcpu16-assembler

JavaScript assembler for the DCPU-16 assembly language in the 0x10c universe
JavaScript
6
star
8

rym-player

Plays top albums from rateyourmusic.com in the terminal using mps-youtube
Ruby
5
star
9

WeatherGrains

Uses granular synthesis to generate music based on weather at different points on the globe. A collaboration with Brien Southward.
JavaScript
5
star
10

glitch_mixer

Mixer and sequencer for minimalist algorithmic compositions
Python
5
star
11

splooshed

JavaScript
4
star
12

phon_rule

Simple LaTeX environment for typesetting phonological rules
TeX
4
star
13

kmeans

Graphical demonstration of k-means algorithm
JavaScript
4
star
14

spotify-genre-features

Scrape feature vectors for 50 songs within each genre on Spotify, output to CSV for analysis
Jupyter Notebook
3
star
15

ld30

Ludum Dare #30: Connected Worlds
JavaScript
3
star
16

diffnow-cli

Command-line interface for comparing files on www.diffnow.com
Shell
3
star
17

foosbot

Office foosball game recorder
Ruby
2
star
18

cosmopolitan

Ruby
2
star
19

music-graphs

Explorations of music influence graphs
Jupyter Notebook
2
star
20

ProblemSetMarmoset

A spin-off of Written Kitten for LaTeX assignments
JavaScript
2
star
21

jezzball3d

old CS 184 final project
C++
2
star
22

urm

Register Machine emulator, based on the four-instruction URM described by Cutland in "Computability"
JavaScript
2
star
23

latex

My LaTeX template for math, CS, and linguistics assignments
1
star
24

dotfiles

dotfiles, configuration files, &c.
Python
1
star
25

asa.li

HTML
1
star
26

dx-search

Diagnosis search.
JavaScript
1
star
27

blog

Jekyll-driven blog
Jupyter Notebook
1
star
28

hp7475a

Plotting utilities and experiments
Python
1
star
29

minecraft_experiments

Lua
1
star
30

FourKingsChess-Client

A multiplayer chaturaji variant with different armies.
JavaScript
1
star
31

calxkcd

XKCD hash algorithm brute-forcer for Berkeley
Python
1
star
32

ld27

10 Second Roguelike
JavaScript
1
star
33

pollex

Ruby wrapper for scraping pollex (the Polynesian Lexicon Project)
Ruby
1
star
34

NotASoul

My entry to Ludum Dare 22
JavaScript
1
star
35

bottles-and-kegs-solver

Prolog program for finding missing numbers in bottles-and-kegs (fizzbuzz) arrangements.
Prolog
1
star
36

gmm

Implementation of EM algorithm for Gaussian Mixture Models in Clojure
Clojure
1
star