A simple Electric Piano synth using frequency modulation, playing some jazz
Log in to post a comment.
ditty.bpm = 150;
const TAU = 2*Math.PI;
const msin = (x,m) => Math.sin(TAU*x + m);
// Choose random element from array
const choose = (array) => array[Math.floor(Math.random() * array.length)];
// Electric piano using phase modulation
const ep1 = synth.def( (phase, env, tick, options) => {
let sig = msin(phase, msin(11*phase,0) * clamp01(1 - 10*tick)*options.amp);
sig = sig + msin(phase, msin(phase,0) * 2 * options.amp);
return sig * env.value;
}, {attack:0.01, release: 0.3, decay: 4, env: adsr2}
);
const mychords = [[c4,'major7'], [a3,'m7'], [d4,'m7'], [g3,'7'],
[c4,'major7'], [a3, '7'], [ab3,'7'], [g3,'7'],
[e4,'m7'], [e4,'m7-5'], [a3,'7sus4'], [a3,'7'],
[d4,'major7'], [d4,'6'], [d4,'m7'], [g3,'7']];
const rhythms = [[0.6,3.4], [1.6,2.4], [2.6,1.4], [3.6,0.4], [0.6, 2, 1.4], [2,1,0.6,0.4]];
loop( () => {
for(let i=0; i<16; i++)
{
const mynote = mychords[i][0];
const mychordname = mychords[i][1];
const mychordnotes = chord(mynote, chords[mychordname]);
const rhythm = choose(rhythms);
for(let ri=0; ri < rhythm.length; ri++)
{
let dur = (Math.random() > 0.5) ? rhythm[ri] : 0;
dur = (dur > 0.8) ? 1 : dur + 0.2;
for(let j=0; j<mychordnotes.length; j++)
{
ep1.play(mychordnotes[j], {amp: Math.random() + 0.3, decay:dur});
}
sleep(rhythm[ri]);
}
}
}, { name: 'EP right hand', amp: 0.1});
loop ( () => {
for(let i=0; i<16; i++)
{
const mynote = mychords[i][0];
const mychordname = mychords[i][1];
const mychordnotes = chord(mynote, chords[mychordname]);
const bassnotes = [mynote-24, mychordnotes[2]-24, mynote-12, mynote-24];
for(let j = 0; j<4; j++)
{
ep1.play(bassnotes[j], {amp:1.7-0.2*j + 0.6*Math.random(), decay: 1});
sleep(1);
}
}
}, {name:"EP left hand", amp:0.2});