electrophone v1.0.0
ElectroPhone
JavaScript Library to build a modular synthesizer.
Based on WebAudio API and WebAudio Effects Libray tuna
Demo Application
https://civa86.github.io/electrophone
HTML5 Application to demonstrate the use of electrophone
library.
Frameworks and Libraries:
Name | Version | Link |
---|---|---|
React | 15.4.1 | https://facebook.github.io/react/ |
Redux | 3.6.0 | http://redux.js.org/ |
jQuery | 1.12.11 | https://jquery.com/ |
jquery-knob | 1.2.11 | http://anthonyterrien.com/knob/ |
Cytoscape.js | 2.5.5 | http://js.cytoscape.org/ |
Moment.js | 2.13.0 | https://momentjs.com/ |
ReduxForm | 6.5.0 | http://redux-form.com/6.5.0/ |
Bootstrap | 3.3.6 | http://getbootstrap.com/ |
Ionicons | 2.0.1 | http://ionicons.com/ |
Development Tools:
Name | Version | Link |
---|---|---|
Babel | 6.18.0 | https://babeljs.io/ |
ESLint | 1.10.3 | http://eslint.org/ |
Less | 2.5.3 | http://lesscss.org/ |
webpack | 1.13.3 | https://webpack.github.io/ |
Mocha | 3.2.0 | https://mochajs.org/ |
Chai | 3.5.0 | http://chaijs.com/ |
ESDoc | 0.4.7 | https://esdoc.org/ |
isparta | 4.0.0 | https://github.com/douglasduteil/isparta |
Library Code Documentation
Code Documentation of the ElectroPhone class provided by the Library.
For a full development documentation:
- Download / Clone the Repository
- Enter in the electrophone project folder
- Run
lib::docs
npm script - Run docs/index.html in a browser
Usage
Install npm module
npm install electrophone
Include Library
With ES5 via <script>
tag:
<script src="<path_to_node_modules>/electrophone/dist/electrophone.min.js"/>
With ES2015 via Babel:
import ElectroPhone from 'electrophone'
Create an instance
// Get the browser AudioContext
var AudioCtx = window.AudioContext || window.webkitAudioContext;
// CREATE A ElectroPhone INSTANCE
var synth = new ElectroPhone(new AudioCtx(), {
//Optional parameters
spectrum: <true|false>, // set true to manage data of playing sound
updateSpectrum: <dataArray => {}>, // on receive data callback
resetSpectrum: <() => {}> // on stop data callback
});
Create Modules
synth.create("moduleLabel", "moduleType", { ...properties });
Update Modules
synth.update("moduleLabel", { ...properties });
Destroy Modules
synth.destroy("moduleLabel");
Link modules
synth.link("sourceModuleLabel", "destinationModuleLabel");
Update Prebuilt Modules
// Master module
synth.master({ ...properties });
// ADSR module
synth.adsr({ ...properties });
Play and Stop sound
// Play a frequency (20 - 20000)
synth.play(440);
// Stop a frequency (20 - 20000)
synth.stop(440);
Get All Created Modules
synth.getModules();
Static Methods
// Get module properties by type.
ElectroPhone.getModuleProperties("moduleType");
// Describe all ElectroPhone modules with properties configuration.
ElectroPhone.describeModules("moduleType");
// Get frequency float value calculated from given note and octave.
ElectroPhone.getFrequency("A", 4);
// Get complete notes list.
ElectroPhone.getNotes();
Constants
The library expose two set of constants: CONST
and TYPES
CONST
The set of string values to setup module properties.
CONST | Description |
---|---|
MASTER | the Master module label |
ADSR | the ADSR module label |
NOISE_WHITE | the white Noise color value |
NOISE_PINK | the pink Noise color value |
NOISE_BROWN | the brown Noise color value |
WAVE_SINE | the sine Wave type value |
WAVE_SQUARE | the square Wave type value |
WAVE_SAWTOOTH | the sawtooth Wave type value |
WAVE_TRIANLGE | the triangle Wave type value |
WAVE_CUSTOM | the custom Wave type value |
FILTER_LOWPASS | the lowpass Filter type value |
FILTER_HIGHPASS | the highpass Filter type value |
FILTER_BANDPASS | the bandpass Filter type value |
FILTER_LOWSHELF | the lowshelf Filter type value |
FILTER_HIGHSHELF | the highshelf Filter type value |
FILTER_PEAKING | the peaking Filter type value |
FILTER_NOTCH | the notch Filter type value |
FILTER_ALLPASS | the allpass Filter type value |
MODULATOR_TARGET_FREQ | the frequency Modulator target value |
MODULATOR_TARGET_DETUNE | the detune Modulator target value |
ENVELOPE_TARGET_GAIN | the gain Envelope target value |
ENVELOPE_TARGET_FREQ | the frequency Envelope target value |
ENVELOPE_TARGET_DETUNE | the detune Envelope target value |
TYPES
The set of string values to create modules.
TYPES | Usage |
---|---|
OSCILLATOR | synth.create('label', ElectroPhone.TYPES.OSCILLATOR, {}) |
NOISE | synth.create('label', ElectroPhone.TYPES.NOISE, {}) |
MODULATOR | synth.create('label', ElectroPhone.TYPES.MODULATOR, {}) |
ENVELOPE | synth.create('label', ElectroPhone.TYPES.ENVELOPE, {}) |
PAN | synth.create('label', ElectroPhone.TYPES.PAN, {}) |
FILTER | synth.create('label', ElectroPhone.TYPES.FILTER, {}) |
DELAY | synth.create('label', ElectroPhone.TYPES.DELAY, {}) |
PINGPONGDELAY | synth.create('label', ElectroPhone.TYPES.PINGPONGDELAY, {}) |
TREMOLO | synth.create('label', ElectroPhone.TYPES.TREMOLO, {}) |
OVERDRIVE | synth.create('label', ElectroPhone.TYPES.OVERDRIVE, {}) |
BITCRUSHER | synth.create('label', ElectroPhone.TYPES.BITCRUSHER, {}) |
MOOGFILTER | synth.create('label', ElectroPhone.TYPES.MOOGFILTER, {}) |
Full Example: Two Voices Synth
// Load library
import ElectroPhone from 'electrophone';
// Build the synth instance (See Usage Section)
const AudioCtx = window.AudioContext || window.webkitAudioContext;
const synth = new ElectroPhone(new AudioCtx());
// Create the first voice
synth.create(
'Voice1',
ElectroPhone.TYPES.OSCILLATOR,
{
wave: ElectroPhone.CONST.WAVE_SAWTOOTH,
detune: 500,
level: 50
}
);
// Create the second voice
synth.create(
'Voice2',
ElectroPhone.TYPES.OSCILLATOR,
{
wave: ElectroPhone.CONST.WAVE_SAWTOOTH,
detune: -500,
level: 50
}
);
//Link voices to Master
synth.link('Voice1', ElectroPhone.CONST.MASTER);
synth.link('Voice2', ElectroPhone.CONST.MASTER);
// Setup ADSR
synth.adsr({ attack: 0, decay: 1, sustain: 50, release: 25 });
// Set Master Volume to 80%
synth.master({ level: 80 });
// Get the A4 note frequency
const a4 = ElectroPhone.getFrequency("A", 4);
// Play the a4 note
synth.play(a4);
// Stop the a4 note after 1 second
setTimeout(() => synth.stop(a4), 1000);
Prebuilt Modules
Every ElectroPhone instance has 2 hardcoded modules: Master
and ADSR
.
This is the minimal configuration to let sound coming out from your sound card and control its behaviour during time.
Master
Main Output Gain.
Property | Type | Values | Default |
---|---|---|---|
level | Integer | 0 - 100 | 100 |
ADSR
Envelope on the master gain. Describes final sound behavior during time.
Property | Type | Values | Default |
---|---|---|---|
attack | Integer | 0 - 100 | 0 |
decay | Integer | 0 - 100 | 1 |
sustain | Integer | 0 - 100 | 100 |
release | Integer | 0 - 100 | 5 |
Sound Modules
Sound Modules can generate sounds and play frequencies.
They can be linked to any Effect Module or directly to Master
Oscillator
Sound Wave Generator.
Property | Type | Values | Default |
---|---|---|---|
level | Integer | 0 - 100 | 100 |
detune | Integer | -1200 - 1200 | 0 |
wave | String | sine, square, sawtooth, triangle, custom | sine |
link | String | master, "any module label" | - |
Noise
Noise Generator.
Property | Type | Values | Default |
---|---|---|---|
level | Integer | 0 - 100 | 100 |
detune | Integer | -1200 - 1200 | 0 |
color | String | white, brown, pink | white |
link | String | master, "any module label" | - |
Control Modules
Control Modules can change the behavior of a specific module property or modify the final sound.
Modulator
An Oscillator that produces modulation on another module property.
It can be linked to any module with freq
or detune
property.
Property | Type | Values | Default |
---|---|---|---|
level | Integer | 0 - 100 | 100 |
freq | Integer | 1 - 100 | 5 |
wave | String | sine, square, sawtooth, triangle, custom | sine |
target | String | frequency, detune | frequency |
link | String | master, "any module label" | - |
Envelope
A module that can describe property changes during time.
It can be linked to any module with level
property (gain target).
Property | Type | Values | Default |
---|---|---|---|
level | Integer | 0 - 100 | 100 |
attack | Integer | 0 - 100 | 0 |
decay | Integer | 0 - 100 | 1 |
sustain | Integer | 0 - 100 | 100 |
release | Integer | 0 - 100 | 5 |
target | String | frequency, detune, gain | gain |
link | String | master, "any module label" | - |
Pan
A module that routes sound between left and right channel.
It can be placed between a Sound Module and its destination to setup stereo routing.
Property | Type | Values | Default |
---|---|---|---|
level | Integer | 0 - 100 | 100 |
pan | Float | -1 - 1 | 0 |
link | String | master, "any module label" | - |
Effect Modules
Effect Modules can change the nature of a sound.
They can be linked to other Effect Modules to create an effect chain and finally to Master.
Filter
A module that filters frequencies with different algorithms.
Property | Type | Values | Default |
---|---|---|---|
level | Integer | 0 - 100 | 100 |
freq | Integer | 20 - 20000 | 440 |
q | Integer | 0 - 100 | 10 |
filterGain | Integer | -40 - 40 | 0 |
filterType | String | lowpass, highpass, bandpass, lowshelf, highshelf, peaking, notch, allpass | lowpass |
bypass | Flag | 0 / 1 | 0 |
link | String | master, "any module label" | - |
Delay
A module that plays a sound back after a period of time.
Property | Type | Values | Default |
---|---|---|---|
level | Integer | 0 - 100 | 100 |
dry | Float | 0 - 1 | 1 |
wet | Float | 0 - 1 | 0.5 |
feedback | Float | 0 - 0.9 | 0.4 |
cutoff | Integer | 20 - 20000 | 440 |
delayTime | Integer | 20 - 1000 | 100 |
bypass | Flag | 0 / 1 | 0 |
link | String | master, "any module label" | - |
PingPongDelay
A different kind of Delay.
Property | Type | Values | Default |
---|---|---|---|
level | Integer | 0 - 100 | 100 |
wet | Float | 0 - 1 | 0.5 |
feedback | Float | 0 - 1 | 0.3 |
cutoff | Integer | 20 - 20000 | 440 |
delayTimeLeft | Integer | 1 - 10000 | 200 |
delayTimeRight | Integer | 1 - 10000 | 400 |
bypass | Flag | 0 / 1 | 0 |
link | String | master, "any module label" | - |
Tremolo
A trembling sound effect.
Property | Type | Values | Default |
---|---|---|---|
level | Integer | 0 - 100 | 100 |
intensity | Float | 0 - 1 | 0.3 |
rate | Float | 0 - 11 | 5 |
stereoPhase | Integer | 0 - 180 | 0 |
bypass | Flag | 0 / 1 | 0 |
link | String | master, "any module label" | - |
Overdrive
A module that alters the sound increasing its gain with distortion.
Property | Type | Values | Default |
---|---|---|---|
level | Integer | 0 - 100 | 100 |
outputGain | Float | 0 - 1 | 1 |
drive | Float | 0 - 1 | 1 |
curveAmount | Float | 0 - 1 | 0.7 |
algorithmIndex | Integer | 0 - 5 | 0 |
bypass | Flag | 0 / 1 | 0 |
link | String | master, "any module label" | - |
Bitcrusher
A module that produces a distortion by the reduction of the resolution or bandwidth of digital audio data.
Property | Type | Values | Default |
---|---|---|---|
level | Integer | 0 - 100 | 100 |
bits | Integer | 1 - 16 | 4 |
normfreq | Float | 0 - 1 | 0.1 |
bufferSize | Integer | 256 - 16384 | 4096 |
bypass | Flag | 0 / 1 | 0 |
link | String | master, "any module label" | - |
Moogfilter
A Moog inspired filter
Property | Type | Values | Default |
---|---|---|---|
level | Integer | 0 - 100 | 100 |
cutoff | Float | 0 - 1 | 0.1 |
resonance | Float | 0 - 4 | 3.5 |
bufferSize | Integer | 256 - 16384 | 4096 |
bypass | Flag | 0 / 1 | 0 |
link | String | master, "any module label" | - |
7 years ago