Last active
April 11, 2020 19:10
-
-
Save petersalomonsen/6ba8fd149e8bee48a37281ba02cfca45 to your computer and use it in GitHub Desktop.
https://petersalomonsen.com/webassemblymusic/livecodev2/?gist=6ba8fd149e8bee48a37281ba02cfca45 (click the download button to download protracker mod)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SONGMODE=PROTRACKER | |
import { writeMod, cmd, clr } from './lib/protrackermodwriter.js'; | |
import { createSamples } from './lib/instrumentgenerator.js'; | |
import { createSampleEcho, insertNotesIntoPattern, insertSampleNotesIntoPattern, toPatternArray, createEmptyPatternArray } from './lib/patterntools.js'; | |
onmessage = function(msg) { | |
const samples = createSamples(msg.data.WASM_SYNTH_BYTES, [ | |
(instance) => { | |
instance.setChannelValue(0, 69 - (12 )); | |
instance.fillSampleBuffer(); | |
return { | |
samplename: "(c) peter salomonsen", | |
funcname: "bass", | |
finetune: 0, | |
volume: 35, | |
loopstart: 0x1000, | |
looptransitionlength: 0x800, | |
looplength: 0x800 | |
}; | |
}, | |
(instance) => { | |
instance.setChannelValue(1, 69 + (12)); | |
instance.fillSampleBuffer(); | |
return { | |
samplename: "april 2020", | |
funcname: "lead", | |
finetune: 0, | |
volume: 40, | |
loopstart: 0x800, | |
looplength: 0x1600, | |
looptransitionlength: 0x800 | |
}; | |
}, | |
(instance) => { | |
instance.setChannelValue(2, 100); | |
instance.fillSampleBuffer(); | |
return { | |
samplename: "written in javascript", | |
funcname: "kick", | |
finetune: 0, | |
volume: 64, | |
loopstart: 0, | |
looplength: 0 | |
}; | |
}, | |
(instance) => { | |
instance.setChannelValue(2, 100); | |
instance.setChannelValue(3, 35); | |
instance.setChannelValue(4, 30); | |
instance.fillSampleBuffer(); | |
return { | |
samplename: "and assemblyscript", | |
funcname: "kickandsnare", | |
finetune: 0, | |
volume: 64, | |
loopstart: 0, | |
looplength: 0 | |
}; | |
}, | |
(instance) => { | |
instance.setChannelValue(2, 100); | |
instance.setChannelValue(4, 30); | |
instance.fillSampleBuffer(); | |
return { | |
samplename: "petersalomonsen.com", | |
funcname: "kickandhihat", | |
finetune: 0, | |
volume: 64, | |
loopstart: 0, | |
looplength: 0 | |
}; | |
}, | |
(instance) => { | |
instance.setChannelValue(3, 100); | |
instance.fillSampleBuffer(); | |
return { | |
samplename: "for more info", | |
funcname: "snare", | |
finetune: 0, | |
volume: 64, | |
loopstart: 0, | |
looplength: 0 | |
}; | |
}, | |
(instance) => { | |
instance.setChannelValue(4, 100); | |
instance.fillSampleBuffer(); | |
return { | |
samplename: "hihat", | |
funcname: "hihat", | |
finetune: 0, | |
volume: 40, | |
loopstart: 0, | |
looplength: 0 | |
}; | |
}, | |
(instance) => { | |
instance.setChannelValue(7, 69 + (12)); | |
instance.setChannelValue(8, 69 + (12) +3 ); | |
instance.setChannelValue(9, 69 + (12) + 7 ); | |
instance.fillSampleBuffer(); | |
return { | |
samplename: "minorchord", | |
funcname: "minorchord", | |
finetune: 0, | |
volume: 25, | |
loopstart: 0x800, | |
looplength: 0x1000, | |
looptransitionlength: 0x800 | |
}; | |
}, | |
(instance) => { | |
instance.setChannelValue(7, 69 + (12)); | |
instance.setChannelValue(8, 69 + (12) + 4 ); | |
instance.setChannelValue(9, 69 + (12) + 7 ); | |
instance.fillSampleBuffer(); | |
return { | |
samplename: "majorchord", | |
funcname: "majorchord", | |
finetune: 0, | |
volume: 25, | |
loopstart: 0x800, | |
looplength: 0x1000, | |
looptransitionlength: 0x800 | |
}; | |
}, | |
(instance) => { | |
instance.setChannelValue(7, 69 + (12)); | |
instance.setChannelValue(8, 69 + (12) + 4 ); | |
instance.setChannelValue(9, 69 + (12) + 9 ); | |
instance.fillSampleBuffer(); | |
return { | |
samplename: "minorchord2", | |
funcname: "minorchord2", | |
finetune: 0, | |
volume: 25, | |
loopstart: 0x800, | |
looplength: 0x1000, | |
looptransitionlength: 0x800 | |
}; | |
}, | |
(instance) => { | |
instance.setChannelValue(7, 69 + (12)); | |
instance.setChannelValue(8, 69 + (12) + 3 ); | |
instance.setChannelValue(9, 69 + (12) + 8 ); | |
instance.fillSampleBuffer(); | |
return { | |
samplename: "majorchord2", | |
funcname: "majorchord2", | |
finetune: 0, | |
volume: 25, | |
loopstart: 0x800, | |
looplength: 0x1000, | |
looptransitionlength: 0x800 | |
}; | |
}, | |
(instance) => { | |
instance.setChannelValue(10, 69); | |
instance.fillSampleBuffer(); | |
return { | |
samplename: "sinelead", | |
funcname: "sinelead", | |
finetune: 0, | |
volume: 35, | |
loopstart: 0x1000, | |
looplength: 0x1000, | |
looptransitionlength: 0x1000 | |
}; | |
}, | |
(instance) => { | |
instance.setChannelValue(7, 69 + (12)); | |
instance.setChannelValue(8, 69 + (12) + 5 ); | |
instance.setChannelValue(9, 69 + (12) + 9 ); | |
instance.fillSampleBuffer(); | |
return { | |
samplename: "majorchord3", | |
funcname: "majorchord3", | |
finetune: 0, | |
volume: 25, | |
loopstart: 0x800, | |
looplength: 0x1000, | |
looptransitionlength: 0x800 | |
}; | |
}, | |
(instance) => { | |
instance.setChannelValue(7, 69 + (12)); | |
instance.setChannelValue(8, 69 + (12) + 5 ); | |
instance.setChannelValue(9, 69 + (12) + 8 ); | |
instance.fillSampleBuffer(); | |
return { | |
samplename: "minorchord3", | |
funcname: "minorchord3", | |
finetune: 0, | |
volume: 25, | |
loopstart: 0x800, | |
looplength: 0x1000, | |
looptransitionlength: 0x800 | |
}; | |
}, | |
]); | |
const moduledef = { | |
songname: "amiga retro shuffle", | |
samples: samples, | |
songpositions: [ | |
// patterns to play | |
// intro | |
1,1, | |
// verse | |
2,2,3,2,4,10, | |
// ref | |
0,0,5,5, | |
// transtion | |
6,6,7,7, | |
// verse | |
2,2,3,2,4,10, | |
// ref | |
0,0,5,5, | |
// intermission | |
11,12,13,14, | |
// ref | |
0,0,5,5, | |
// transtion | |
6,6,7,7,8,9 | |
], | |
patterns: [ | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,snare(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),kickandhihat(a3),,,snare(a3) | |
,,,kickandhihat(a3),,, | |
].repeat(1)).insertNotes(bass, 0, 0, [ | |
b1,,,cmd(0xa,0xc),,b2, | |
,,b1(0xa, 0xc),b2,,a1, | |
g1,,,g2,,, | |
d2,,,d3,,, | |
e1,,,cmd(0xa,0xc),,e2, | |
,,e1(0xa, 0xc),e2,,a1, | |
d1,,,d2,,, | |
a1,,,a2,,cmd(0xd) | |
]).createSampleEcho(bass(), 0, 20, 8, [2]) | |
.insertNotes(sinelead, 0, 3, [ | |
cmd(0xa,0xc),,,fs2,,, | |
e2,,,d2,,, | |
g2(0xa,0x6),,g3(0xc,6),g2,cmd(0xa,0x8),, | |
f2(0x1,0x4),,e2,d2,,e2, | |
,,,cmd(0xa,0x8),,d2(0xa,0xa), | |
e2,,d2(0xa,0xa),e2,,d2, | |
fs2,,,e2,,d2, | |
e2,,d2,b1,,a1 | |
]).createSampleEcho(sinelead(), 3, 20, 8, [2]) | |
.insertSampleNotes(0, 2, [ | |
minorchord(b2),,,,cmd(0xa,0x8),, | |
,,,,,, | |
majorchord2(b2),,cmd(0xa,0x8),,,, | |
majorchord3(a2),,,,cmd(0xa,0x8),minorchord2(g2) | |
,cmd(0x0),cmd(0x0),cmd(0x0),cmd(0xa,0x8) | |
,,,,,, | |
,,,majorchord3(a2),cmd(0x0),cmd(0x0), | |
,,,majorchord(a2),cmd(0x0),cmd(0x0), | |
]), | |
// pattern 1 | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,snare(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),kickandhihat(a3),,,snare(a3) | |
,,,kickandhihat(a3),,, | |
].repeat(1)) | |
.createSampleEcho(kickandhihat(), 0, 10, 1, [3]) | |
.insertNotes(bass, 0, 0, [ | |
b1,,,cmd(0xa,0xc),,b2, | |
,,b1(0xa, 0xc),b2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,a1,cmd(0xa,0xc),, | |
b1,cmd(0xa,0xc),,,,b2(0xa,0xf), | |
,,b1(0xa, 0xc),b2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,cmd(0xa,0xf),,cmd(0xd) | |
]).createSampleEcho(bass(), 0, 20, 8, [2]), | |
// pattern 2 | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,snare(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),kickandhihat(a3),,,snare(a3) | |
,,,kickandhihat(a3),,, | |
].repeat(1)) | |
.createSampleEcho(kickandhihat(), 0, 10, 1, [3]) | |
.insertNotes(bass, 0, 0, [ | |
b1,,,cmd(0xa,0xc),,b2, | |
,,b1(0xa, 0xc),b2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,a1,cmd(0xa,0xc),, | |
b1,cmd(0xa,0xc),,,,b2(0xa,0xf), | |
,,b1(0xa, 0xc),b2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,cmd(0xa,0xf),,cmd(0xd) | |
]).createSampleEcho(bass(), 0, 20, 8, [2]) | |
.insertNotes(lead, 0,2, [ | |
,,a1,b1,,,d2,, | |
e2,,,f2(0x1,0x5),,, | |
e2,,,d2(0xc,15),e2,, | |
,,,fs2,d2,, | |
,,,d2(0xa,0x8),a2,,, | |
gs2,,,fs2,cmd(0x1,0x7),cmd(0),e2(0xa,0x8) | |
,,,f2(0xa,0x6),,,fs2(0xa,0x8) | |
]).createSampleEcho(lead(), 5, 8, 8, [2,0]), | |
// pattern 3 | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,snare(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),kickandhihat(a3),,,snare(a3) | |
,,,kickandhihat(a3),,, | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,snare(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,snare(a3,0xc,30), | |
kickandhihat(a3),,snare(a3,0xc,30),kickandhihat(a3),,snare(a3,0xc,20),snare(a3) | |
,,,kickandhihat(a3),,snare(a3,0xc,20), | |
]) | |
.createSampleEcho(kickandhihat(), 0, 10, 1, [3]) | |
.insertNotes(bass, 0, 0, [ | |
e1,,,cmd(0xa,0xc),,e2, | |
,,e1(0xa, 0xc),e2,cmd(0xa,0xf),, | |
g1(0xa,0xf),,g2(0xa,0xf),a2(0xa,0xf),,, | |
as1(0xa,0xc),,,b1,cmd(0xa,0xc),, | |
e1,cmd(0xa,0xc),,,,e2(0xa,0xf), | |
,,e1(0xa, 0xc),e2,cmd(0xa,0xf),, | |
g1(0xa,0xf),,g2(0xa,0xf),a2(0xa,0xf),,, | |
as1(0xa,0xc),,,cmd(0xa,0xf),,cmd(0xd) | |
]).createSampleEcho(bass(), 0, 20, 8, [2]) | |
.insertNotes(lead, 0,2, [ | |
,,a1,b1,,,d2,, | |
e2,,,f2(0x1,0x5),,, | |
e2,,,d2(0xc,15),e2,, | |
,,,fs2,d2,, | |
,,,d2(0xa,0x8),,,, | |
a2(0xc,10), | |
d3(0xc,14), | |
e3(0xc,18), | |
g3(0xc,22), | |
a3(0xc,26), | |
b3(0xc,30), | |
a3(0xc,34), | |
g3(0xc,38), | |
e3(0xc,34), | |
d3(0xc,28), | |
b2(0xc,24), | |
a2(0xc,22), | |
g2(0xc,18), | |
e2(0xc,14), | |
d2(0xc,10) | |
]) | |
.createSampleEcho(lead(), 5, 8, 8, [2,0]) | |
.insertSampleNotes(0,3,[ | |
majorchord(g2,0xa,0x6),,,majorchord(g2,0xa,0x6),,, | |
majorchord(g2,0xa,0x6),,,majorchord(g2,0xa,0x6),,, | |
majorchord3(e2,0xa,0x6),,,majorchord3(e2,0xa,0x6),,, | |
majorchord3(e2,0xa,0x6),,,majorchord3(e2,0xa,0x6),,, | |
majorchord3(d2,0xc,0x22),cmd(0xa,0xc),,,, | |
majorchord3(d2,0xc,0x16),cmd(0xa,0xc),,,, | |
majorchord3(d2,0xc,0x0c),cmd(0xa,0xc),,,, | |
majorchord3(d2,0xc,0x05),cmd(0xa,0xc),,,, | |
]), | |
// pattern 4 | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,snare(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),kickandhihat(a3),,,snare(a3) | |
,,,kickandhihat(a3),,, | |
].repeat(1)) | |
.createSampleEcho(kickandhihat(), 0, 10, 1, [3]) | |
.insertNotes(bass, 0, 0, [ | |
fs1,,,cmd(0xa,0xc),,fs2, | |
,,fs1(0xa, 0xc),fs2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,a1,cmd(0xa,0xc),, | |
e1,cmd(0xa,0xc),,,,e2(0xa,0xf), | |
,,e1(0xa, 0xc),e2,cmd(0xa,0xf),, | |
g1(0xa,0xf),,g2(0xa,0xf),a2(0xa,0xf),,, | |
as1(0xa,0xc),,,cmd(0xa,0xf),,cmd(0xd) | |
]).createSampleEcho(bass(), 0, 20, 8, [2]) | |
.insertNotes(lead, 0,2, [ | |
,,,fs2,,, | |
fs2,,,e2,,fs2, | |
,,fs2,,,e2, | |
a2,,,fs2,,, | |
,,,b2,,, | |
d3,,,e3,,f3(0x1,0x2), | |
,,e3,,,d3, | |
e3,,d3,b2 | |
]) | |
.createSampleEcho(lead(), 5, 8, 8, [2,0]) | |
.insertSampleNotes(0,3,[ | |
]), | |
// pattern 5 | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,snare(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),kickandhihat(a3),,,snare(a3) | |
,,,kickandhihat(a3),,, | |
].repeat(1)).insertNotes(bass, 0, 0, [ | |
g1,,,cmd(0xa,0xc),,g2, | |
,,g1(0xa, 0xc),g2,,g1, | |
d1,,,d2,,, | |
fs1,,,fs2,,, | |
b1,,,cmd(0xa,0xc),,b2, | |
,,b1(0xa, 0xc),b2,,b1, | |
d1,,,d2,,, | |
d1,,,d2,,cmd(0xd) | |
]).createSampleEcho(bass(), 0, 20, 8, [2]) | |
.insertNotes(sinelead, 0, 3, [ | |
,cmd(0xa,0xa),,fs2,,, | |
a2,cmd(0xa,0x6),,b2,,a2(0xa,0x3), | |
,,fs3(0xc,0x5),fs2(0xa,0x3),,e2, | |
,,,d2,,fs2, | |
,,,b2(0xa,0xc),,, | |
d3(0xa,0xc),,,e3(0xa,0xc),,, | |
f3(0x1,0x2),,,e3(0xa,0xc),,d3, | |
ds3(0x1,0x2),,d3,b2(0xa,0x5),,a2(0xa,0x3) | |
]).createSampleEcho(sinelead(), 3, 20, 8, [2]) | |
.insertSampleNotes(0, 2, [ | |
majorchord2(b2),,,,cmd(0xa,0xa),, | |
,,,,,, | |
majorchord3(a2),,cmd(0xa,0xa),,,, | |
majorchord(a2),,,,cmd(0xa,0xa),minorchord(b2) | |
,cmd(0x0),cmd(0x0),cmd(0x0),cmd(0xa,0xa) | |
,,,,,, | |
,,,majorchord3(a2),cmd(0x0),cmd(0x0), | |
,,,majorchord3(a2),cmd(0x0),cmd(0x0), | |
]), | |
// pattern 6 | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,snare(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),kickandhihat(a3),,,snare(a3) | |
,,,kickandhihat(a3),,, | |
].repeat(1)) | |
.createSampleEcho(kickandhihat(), 0, 10, 1, [3]) | |
.insertNotes(bass, 0, 0, [ | |
b1,,,cmd(0xa,0xc),,b2, | |
,,b1(0xa, 0xc),b2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,a1,cmd(0xa,0xc),, | |
b1,cmd(0xa,0xc),,,,b2(0xa,0xf), | |
,,b1(0xa, 0xc),b2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,cmd(0xa,0xf),,cmd(0xd) | |
]).createSampleEcho(bass(), 0, 20, 8, [2]) | |
.insertNotes(sinelead, 0,2, [ | |
,,b2(0xa,0xf),b3(0xa,0xf),,a3(0xa,0xf), | |
,,fs3(0xa,0xf),,,, | |
e3(0xa,0xf),,fs3(0xa,0xf),a3(0xa,0xf),,, | |
e3(0xa,0xf),,fs3(0xa,0xf),a3(0xa,0xf),,, | |
,,b2(0xa,0xf),b3(0xa,0xf),,a3(0xa,0xf), | |
,,fs3(0xa,0xf),,,, | |
e3(0xa,0xf),,fs3(0xa,0xf),a3(0xa,0xf),,, | |
b3(0xa,0xf),,a3(0xa,0xf),fs3(0xa,0xf),,, | |
]) | |
.createSampleEcho(sinelead(), 5, 4, 8, [2,3], 48, 12), | |
// pattern 7 | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,snare(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),kickandhihat(a3),,,snare(a3) | |
,,,kickandhihat(a3),,, | |
].repeat(1)) | |
.createSampleEcho(kickandhihat(), 0, 10, 1, [3]) | |
.insertNotes(bass, 0, 0, [ | |
b1,,,cmd(0xa,0xc),,b2, | |
,,b1(0xa, 0xc),b2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,a1,cmd(0xa,0xc),, | |
b1,cmd(0xa,0xc),,,,b2(0xa,0xf), | |
,,b1(0xa, 0xc),b2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,cmd(0xa,0xf),,cmd(0xd) | |
]).createSampleEcho(bass(), 0, 20, 8, [2]) | |
.insertSampleNotes(0,3,[ | |
minorchord3(fs2,0xa,0x6),,,minorchord3(fs2,0xa,0x6),,, | |
minorchord3(fs2,0xa,0x6),,,minorchord3(fs2,0xa,0x6),,, | |
majorchord3(e2,0xa,0x6),,,majorchord3(e2,0xa,0x6),,, | |
majorchord3(e2,0xa,0x6),,,majorchord3(e2,0xa,0x6),,, | |
majorchord3(d2,0xc,0x22),cmd(0xa,0xc),,,, | |
majorchord3(d2,0xc,0x16),cmd(0xa,0xc),,,, | |
majorchord3(d2,0xc,0x0c),cmd(0xa,0xc),,,, | |
majorchord3(d2,0xc,0x05),cmd(0xa,0xc),,,, | |
]), | |
// pattern 8 | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,snare(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),kickandhihat(a3),,,snare(a3) | |
,,,kickandhihat(a3),,, | |
].repeat(1)) | |
.createSampleEcho(kickandhihat(), 0, 10, 1, [3]) | |
.insertNotes(bass, 0, 0, [ | |
b1,,,cmd(0xa,0xc),,b2, | |
,,b1(0xa, 0xc),b2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,a1,cmd(0xa,0xc),, | |
b1,cmd(0xa,0xc),,,,b2(0xa,0xf), | |
,,b1(0xa, 0xc),b2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,cmd(0xa,0xf),,cmd(0xd) | |
]).createSampleEcho(bass(), 0, 20, 8, [2]) | |
.insertSampleNotes(0,3,[ | |
minorchord3(fs2,0xa,0x6),,,minorchord3(fs2,0xa,0x6),,, | |
minorchord3(fs2,0xa,0x6),,,minorchord3(fs2,0xa,0x6),,, | |
majorchord3(e2,0xa,0x6),,,majorchord3(e2,0xa,0x6),,, | |
majorchord3(e2,0xa,0x6),,,majorchord3(e2,0xa,0x6),,, | |
majorchord3(d2,0xc,0x22),cmd(0xa,0xc),,,, | |
majorchord3(d2,0xc,0x16),cmd(0xa,0xc),,,, | |
majorchord3(d2,0xc,0x0c),cmd(0xa,0xc),,,, | |
majorchord3(d2,0xc,0x05),cmd(0xa,0xc),,,, | |
]).insertNotes(sinelead, 0,2, [ | |
,,b2(0xa,0xf),b3(0xa,0xf),,a3(0xa,0xf), | |
,,fs3(0xa,0xf),,,, | |
e3(0xa,0xf),,fs3(0xa,0xf),a3(0xa,0xf),,, | |
e3(0xa,0xf),,fs3(0xa,0xf),a3(0xa,0xf),,, | |
,,b2(0xa,0xf),b3(0xa,0xf),,a3(0xa,0xf), | |
,,fs3(0xa,0xf),,,, | |
e3(0xa,0xf),,fs3(0xa,0xf),a3(0xa,0xf),,, | |
b3(0xa,0xf),,a3(0xa,0xf),fs3(0xa,0xf),,, | |
]) | |
.createSampleEcho(sinelead(), 5, 4, 8, [2,3], 48, 12), | |
// pattern 9 | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,snare(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),kickandhihat(a3),,,snare(a3) | |
,,,kickandhihat(a3),,, | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,snare(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,snare(a3,0xc,20),kickandhihat(a3),,snare(a3,0xc,20),snare(a3) | |
,,,kickandhihat(a3),,snare(a3,0xc,20), | |
kick(a3) | |
]) | |
.createSampleEcho(kickandhihat(), 0, 10, 1, [3]) | |
.insertNotes(bass, 0, 0, [ | |
b1,,,cmd(0xa,0xc),,b2, | |
,,b1(0xa, 0xc),b2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,a1,cmd(0xa,0xc),, | |
b1,cmd(0xa,0xc),,,,b2(0xa,0xf), | |
,,b1(0xa, 0xc),b2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,cmd(0xa,0xf),,cmd(0xd), | |
]).createSampleEcho(bass(), 0, 20, 8, [2]) | |
.insertSampleNotes(0,3,[ | |
minorchord3(fs2,0xa,0x6),,,minorchord3(fs2,0xa,0x6),,, | |
minorchord3(fs2,0xa,0x6),,,minorchord3(fs2,0xa,0x6),,, | |
majorchord3(e2,0xa,0x6),,,majorchord3(e2,0xa,0x6),,, | |
majorchord3(e2,0xa,0x6),,,majorchord3(e2,0xa,0x6),,, | |
majorchord3(d2,0xc,0x22),cmd(0xa,0xc),,,, | |
majorchord3(d2,0xc,0x16),cmd(0xa,0xc),,,, | |
majorchord3(d2,0xc,0x0c),cmd(0xa,0xc),,,, | |
majorchord3(d2,0xc,0x05),cmd(0xa,0xc),,,, | |
]).insertNotes(sinelead, 0,2, [ | |
,,b2(0xa,0xf),b3(0xa,0xf),,a3(0xa,0xf), | |
,,fs3(0xa,0xf),,,, | |
e3(0xa,0xf),,fs3(0xa,0xf),a3(0xa,0xf),,, | |
e3(0xa,0xf),,fs3(0xa,0xf),a3(0xa,0xf),,, | |
,,b2(0xa,0xf),b3(0xa,0xf),,a3(0xa,0xf), | |
,,fs3(0xa,0xf),,,, | |
e3(0xa,0xf),,fs3(0xa,0xf),a3(0xa,0xf),,, | |
b3(0xa,0xf),,a3(0xa,0xf),fs3(0xa,0xf),,, | |
,cmd(0xa,0xc),, | |
]) | |
.createSampleEcho(sinelead(), 5, 4, 8, [2,3], 48, 12), | |
// pattern 10 | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,snare(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),kickandhihat(a3),,,snare(a3) | |
,,,kickandhihat(a3),,, | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,snare(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
hihat(a3),,hihat(a3,0xc,0x10),kickandhihat(a3,0xc,0x20),,snare(a3,0xc,0x20) | |
]) | |
.createSampleEcho(kickandhihat(), 0, 10, 1, [3]) | |
.insertNotes(bass, 0, 0, [ | |
b1,,,cmd(0xa,0xc),,b2, | |
,,b1(0xa, 0xc),b2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,a1,cmd(0xa,0xc),, | |
b1,cmd(0xa,0xc),,,,b2(0xa,0xf), | |
,,b1(0xa, 0xc),b2,cmd(0xa,0xf),, | |
e1(0xa,0xf),,e2(0xa,0xf),f2(0xa,0xf),,, | |
fs1(0xa,0xc),,,cmd(0xa,0xf),,cmd(0xd) | |
]).createSampleEcho(bass(), 0, 20, 8, [2]) | |
.insertNotes(lead, 0,2, [ | |
,,d3(0xc,10),b2(0xc,10) | |
]) | |
.createSampleEcho(lead(), 5, 8, 2, [2,0]) | |
, | |
// pattern 11 | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,kickandhihat(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,, | |
].repeat(1)) | |
.createSampleEcho(kickandhihat(), 0, 10, 1, [3]) | |
.insertNotes(bass, 0, 0, [ | |
e1,,,cmd(0xa,0xc),,, | |
,,,,,d2(0xa,0xc), | |
,,e2(0xa,0xc),,,b1(0xa,0xc), | |
d2(0xa,0xc),,,,,, | |
b1,,,cmd(0xa,0xc),,, | |
,,,,,a2(0xa,0xc), | |
,,b2(0xa,0xc),,,fs1(0xa,0xc), | |
a1(0xa,0xc),,,fs1(0xa,0xc),,cmd(0xd) | |
]).createSampleEcho(bass(), 0, 20, 8, [2]) | |
.insertNotes(lead, 0,2, [ | |
,,a1,b1,,, | |
d2(0xa,0x8),,,e2,cmd(0xa,0x8),, | |
f2(0x1,0x3),cmd(4,0x62),cmd(6,0x01),cmd(6,0x01),cmd(6,0x01),cmd(6,0x01), | |
a2,cmd(4,0x62),cmd(6,0x01),cmd(6,0x01),cmd(6,0x01),cmd(6,0x01) | |
,,,,,, | |
,,,,,, | |
a2,b2,,,d3,,, | |
]) | |
.createSampleEcho(lead(), 5, 8, 2, [2,0]) | |
.insertSampleNotes(0,3, | |
[minorchord(e1,0xc,0x8)].concat([cmd(0xe,0xa1)].repeat(7)) | |
.concat([cmd(0xe,0xb1)].repeat(8)) | |
.concat([ | |
minorchord(fs1,0xc,0xc), | |
]).concat([cmd(0xe,0xa1)].repeat(3)) | |
.concat([ | |
minorchord3(fs1,0xc,0x14) | |
]) | |
.concat([cmd(0xe,0xa1)].repeat(7)) | |
.concat([cmd(0xe,0xb1)].repeat(10)) | |
), | |
// pattern 12 | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,,kickandhihat(a3) | |
,,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,, | |
].repeat(1)) | |
.createSampleEcho(kickandhihat(), 0, 10, 1, [3]) | |
.insertNotes(bass, 0, 0, [ | |
e1,,,cmd(0xa,0xc),,, | |
,,,,,d2(0xa,0xc), | |
,,e2(0xa,0xc),,,b1(0xa,0xc), | |
d2(0xa,0xc),,,,,, | |
b1,,,cmd(0xa,0xc),,, | |
,,,,,a2(0xa,0xc), | |
,,b2(0xa,0xc),,,fs1(0xa,0xc), | |
a1(0xa,0xc),,,fs1(0xa,0xc),,cmd(0xd) | |
]).createSampleEcho(bass(), 0, 20, 8, [2]) | |
.insertNotes(lead, 0,2, [ | |
,,fs3,e3,,, | |
d3(0xa,0x8),,,b2,cmd(0xa,0x8),, | |
e3,cmd(4,0x62),d3,,,, | |
b2,,,a2,,b2 | |
]) | |
.createSampleEcho(lead(), 5, 8, 2, [2,0]) | |
.insertSampleNotes(0,3, | |
[minorchord(e1,0xc,0x8)].concat([cmd(0xe,0xa1)].repeat(7)) | |
.concat([cmd(0xe,0xb1)].repeat(8)) | |
.concat([ | |
minorchord(fs1,0xc,0xc), | |
]).concat([cmd(0xe,0xa1)].repeat(3)) | |
.concat([ | |
minorchord3(fs1,0xc,0x14) | |
]) | |
.concat([cmd(0xe,0xa1)].repeat(7)) | |
.concat([cmd(0xe,0xb1)].repeat(10)) | |
), | |
// pattern 13 | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,, | |
snare(a3),,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,snare(a3,0xc,10), | |
snare(a3),,hihat(a3,0xc,0x10),hihat(a3),,, | |
].repeat(1)) | |
.createSampleEcho(kickandhihat(), 0, 10, 1, [3]) | |
.insertNotes(bass, 0, 0, [ | |
e1,,,cmd(0xa,0xc),,, | |
,,,,,d2(0xa,0xc), | |
,,e2(0xa,0xc),,,b1(0xa,0xc), | |
d2(0xa,0xc),,,,,, | |
b1,,,cmd(0xa,0xc),,, | |
,,,,,a2(0xa,0xc), | |
,,b2(0xa,0xc),,,fs1(0xa,0xc), | |
a1(0xa,0xc),,,fs1(0xa,0xc),,cmd(0xd) | |
]).createSampleEcho(bass(), 0, 20, 8, [2]) | |
.insertNotes(lead, 0,2, [ | |
,,a1,b1,,, | |
d2(0xa,0x8),,,e2,cmd(0xa,0x8),, | |
f2(0x1,0x3),cmd(4,0x62),cmd(6,0x01),cmd(6,0x01),cmd(6,0x01),cmd(6,0x01), | |
a2,cmd(4,0x62),cmd(6,0x01),cmd(6,0x01),cmd(6,0x01),cmd(6,0x01) | |
,,,,,, | |
,,,,,, | |
a2,b2,,,d3,,, | |
]) | |
.createSampleEcho(lead(), 5, 8, 2, [2,0]) | |
.insertSampleNotes(0,3, | |
[minorchord(e1,0xc,0x8)].concat([cmd(0xe,0xa1)].repeat(7)) | |
.concat([cmd(0xe,0xb1)].repeat(8)) | |
.concat([ | |
minorchord(fs1,0xc,0xc), | |
]).concat([cmd(0xe,0xa1)].repeat(3)) | |
.concat([ | |
minorchord3(fs1,0xc,0x14) | |
]) | |
.concat([cmd(0xe,0xa1)].repeat(7)) | |
.concat([cmd(0xe,0xb1)].repeat(10)) | |
), | |
// pattern 14 | |
createEmptyPatternArray() | |
.insertSampleNotes( | |
0,1, [ | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,, | |
snare(a3),,hihat(a3,0xc,0x10),hihat(a3),,kickandhihat(a3,0xc,0x10), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,snare(a3,0xc,10), | |
snare(a3),,hihat(a3,0xc,0x10),hihat(a3),,, | |
kickandhihat(a3),,hihat(a3,0xc,0x10),hihat(a3),,, | |
snare(a3),,hihat(a3,0xc,0x10),hihat(a3),,snare(a3,0xc,0x30), | |
kickandhihat(a3),,hihat(a3,0xc,0x10),snare(a3),,snare(a3,0xc,10), | |
snare(a3),,hihat(a3,0xc,0x10),snare(a3,0xc,30),,snare(a3,0xc,40), | |
]) | |
.createSampleEcho(kickandhihat(), 0, 10, 1, [3]) | |
.insertNotes(bass, 0, 0, [ | |
e1,,,cmd(0xa,0xc),,, | |
,,,,,d2(0xa,0xc), | |
,,e2(0xa,0xc),,,b1(0xa,0xc), | |
d2(0xa,0xc),,,,,, | |
b1,,,cmd(0xa,0xc),,, | |
,,,,,a2(0xa,0xc), | |
,,b2(0xa,0xc),,,cs3(0x1,0x3),cmd(4,0x62) | |
,cmd(6,0x63),b2(0xa,0xc),a2(0xa,0xc),,fs2(0xa,0xc) | |
]).createSampleEcho(bass(), 0, 20, 8, [2]) | |
.insertNotes(lead, 0,2, [ | |
,,fs3,e3,,, | |
d3(0xa,0x8),,,b2,cmd(0xa,0x8),, | |
e3,cmd(4,0x62),d3,,,, | |
b2,,,a2,,b2, | |
,,,,,, | |
a1(0xc,10),cs2(0xc,12),e2(0xc,14),a2(0xc,16),b2(0xc,18),cs3(0xc,20), | |
e3(0xc,22),,,,,, | |
,,,,,cmd(0xd) | |
]) | |
.createSampleEcho(lead(), 5, 8, 2, [2,0]) | |
.insertNotes(sinelead, 32, 3, [ | |
,,,a2,cs3,,, | |
d3,,,,,,a2(0xa,0x3),,b2(0xa,0x3) | |
]) | |
.insertSampleNotes(0,3, | |
[minorchord(e1,0xc,0x8)].concat([cmd(0xe,0xa1)].repeat(7)) | |
.concat([cmd(0xe,0xb1)].repeat(8)) | |
.concat([ | |
minorchord(fs1,0xc,0xc), | |
]).concat([cmd(0xe,0xa1)].repeat(3)) | |
.concat([ | |
majorchord3(e1,0xc,0x10) | |
]) | |
.concat([cmd(0xe,0xa1)].repeat(10)) | |
.concat([ | |
majorchord3(e2,0xa,0x5),,, | |
majorchord3(e2,0xa,0x5),,, | |
majorchord(a2,0xa,0x2),,, | |
majorchord(a2),,cmd(0xa,0x5), | |
]) | |
) | |
] | |
}; | |
// Set tempo on the first pattern in songpositions | |
moduledef.patterns[moduledef.songpositions[0]][0][2] = 0xf; | |
moduledef.patterns[moduledef.songpositions[0]][0][3] = 160; | |
postMessage(writeMod(moduledef)); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { EQBand } from "../fx/eqband"; | |
import { Rimshot } from "../instruments/drums/rimshot.class"; | |
import { StereoSignal } from "../synth/stereosignal.class"; | |
import { Kick } from "../instruments/kick.class"; | |
import { BrassyLead } from "../instruments/lead/brassy"; | |
import { Hihat } from "../instruments/hihat.class"; | |
import { FlatPad } from "../instruments/pad/flatpad.class"; | |
import { createInstrumentArray } from '../common/mixcommon'; | |
import { Freeverb } from "../fx/freeverb"; | |
import { SineOscillator } from "../synth/sineoscillator.class"; | |
import { SawOscillator } from '../synth/sawoscillator.class'; | |
import { Envelope } from "../synth/envelope.class"; | |
import { Noise } from "../synth/noise.class"; | |
import { BiQuadFilter, FilterType, Q_BUTTERWORTH } from "../synth/biquad"; | |
import { WaveShaper } from "../synth/shaper"; | |
import { SAMPLERATE } from "../environment"; | |
import { notefreq } from "../synth/note"; | |
import { BandPass } from "../fx/bandpass"; | |
import { WaveShaper } from '../synth/shaper'; | |
export const PATTERN_SIZE_SHIFT: usize = 4; | |
export const BEATS_PER_PATTERN_SHIFT: usize = 2; | |
const gain: f32 = 0.2; | |
export class Eftang { | |
private _note: f32; | |
readonly lfo: SineOscillator = new SineOscillator(); | |
readonly osc: SawOscillator = new SawOscillator(); | |
readonly osc2: SawOscillator = new SawOscillator(); | |
readonly osc3: SawOscillator = new SawOscillator(); | |
readonly shaper: WaveShaper = new WaveShaper(); | |
readonly noise: Noise = new Noise(); | |
readonly env1: Envelope = new Envelope(0.001, 0.3, 0.8, 0.3); | |
readonly bp1: BandPass = new BandPass(200, 350); | |
readonly env2: Envelope = new Envelope(0.1, 0.2, 0.5, 1); | |
readonly bp2: BandPass = new BandPass(3000, 7000); | |
readonly env3: Envelope = new Envelope(0.001, 0.3, 0.1, 0.1); | |
readonly bp3: BandPass = new BandPass(10, 150); | |
readonly signal: StereoSignal = new StereoSignal(); | |
constructor() { | |
this.shaper.drive = 0.1; | |
} | |
set note(note: f32) { | |
if(note > 1) { | |
this.osc.frequency = notefreq(note); | |
this.osc2.frequency = notefreq(note - 0.02); | |
this.osc3.frequency = notefreq(note + 0.02); | |
this.lfo.position = 0; | |
this.lfo.frequency = 4; | |
this.env1.attack(); | |
this.env2.attack(); | |
this.env3.attack(); | |
} else { | |
this.env1.release(); | |
this.env2.release(); | |
this.env3.release(); | |
} | |
this._note = note; | |
} | |
get note(): f32 { | |
return this._note; | |
} | |
next(): void { | |
const env1: f32 = this.env1.next(); | |
if(env1 === 0) { | |
this.signal.clear(); | |
return; | |
} | |
const env2: f32 = this.env2.next(); | |
const env3: f32 = this.env3.next(); | |
const osc: f32 = this.osc.next() + this.osc2.next() + this.osc3.next(); | |
const lfo = this.lfo.next() + 1; | |
const basefreq = this.osc.frequency; | |
this.bp1.update_frequencies(20, basefreq + 1); | |
this.bp2.update_frequencies(basefreq * 1.5,basefreq * 1.6); | |
this.bp3.update_frequencies(basefreq * 12, 8000 + (lfo * 5000)); | |
const noise = this.noise.next(); | |
const sig1 = this.bp1.process(osc) * env1; | |
const sig2 = this.bp2.process(osc) * env2; | |
const sig3 = this.bp3.process(osc + noise * 0.05) * env3; | |
this.signal.left = this.shaper.process(sig1 + sig2 + sig3); | |
this.signal.right = this.shaper.process( sig1 + sig2 + sig3); | |
} | |
} | |
export class SawBass3 { | |
private _note: f32; | |
readonly envelope: Envelope = new Envelope(0.01, 0.3, 0.8, 0.2); | |
readonly filterenv: Envelope = new Envelope(0.01, 0.1, 0.01, 0.2); | |
readonly sawoscillator: SawOscillator = new SawOscillator(); | |
readonly sawoscillator2: SawOscillator = new SawOscillator(); | |
readonly shaper: WaveShaper = new WaveShaper(); | |
readonly filter: BiQuadFilter = new BiQuadFilter(); | |
readonly lpfilter: BiQuadFilter = new BiQuadFilter(); | |
readonly band1: BandPass = new BandPass(1000, 2000); | |
readonly signal: StereoSignal = new StereoSignal(); | |
constructor() { | |
this.shaper.drive = 0.5; | |
} | |
set note(note: f32) { | |
if(note > 1) { | |
this.sawoscillator.frequency = notefreq(note + 0); | |
this.sawoscillator2.frequency = notefreq(note + 19); | |
this.envelope.attack(); | |
this.filterenv.attack(); | |
} else { | |
this.envelope.release(); | |
this.filterenv.release(); | |
} | |
this._note = note; | |
} | |
get note(): f32 { | |
return this._note; | |
} | |
next(): void { | |
let env: f32 = this.envelope.next(); | |
if(env === 0) { | |
this.signal.clear(); | |
return; | |
} | |
let filterenv = this.filterenv.next(); | |
let signal = this.sawoscillator.next() + this.sawoscillator2.next() * 0.2; | |
signal *= env; | |
this.lpfilter.update_coeffecients(FilterType.LowPass, SAMPLERATE, | |
this.sawoscillator.frequency + (8 * this.sawoscillator.frequency * filterenv), Q_BUTTERWORTH); | |
const band1freq = this.sawoscillator.frequency * 1; | |
this.band1.update_frequencies(band1freq, band1freq + env * this.sawoscillator.frequency); | |
let band1 = this.band1.process(signal); | |
signal = this.lpfilter.process(signal); | |
signal = this.shaper.process(signal); | |
this.signal.left = signal * 2 + band1; | |
this.signal.right = signal * 2 - band1; | |
} | |
} | |
class SineLead { | |
private _note: f32; | |
readonly osc: SineOscillator = new SineOscillator(); | |
readonly lfo: SineOscillator = new SineOscillator(); | |
readonly env1: Envelope = new Envelope(0.02, 0.10, 0.2, 0.3); | |
readonly noiseenv: Envelope = new Envelope(0.01, 0.02, 0.1, 0.3); | |
readonly signal: StereoSignal = new StereoSignal(); | |
private noise: Noise = new Noise(); | |
hpfilterl: BiQuadFilter = new BiQuadFilter(); | |
hpfilterr: BiQuadFilter = new BiQuadFilter(); | |
private bandpass: BandPass = new BandPass(400,2000); | |
private shaper: WaveShaper = new WaveShaper(); | |
constructor() { | |
this.hpfilterl.update_coeffecients(FilterType.HighPass, SAMPLERATE, 7000, 0.5); | |
this.hpfilterr.update_coeffecients(FilterType.HighPass, SAMPLERATE, 7000, 0.5); | |
} | |
set note(note: f32) { | |
if(note > 1) { | |
this.osc.frequency = notefreq(note + 12); | |
this.lfo.frequency = 8; | |
this._note = note; | |
this.env1.attack(); | |
this.noiseenv.attack(); | |
} else { | |
this.env1.release(); | |
this.noiseenv.release(); | |
} | |
} | |
get note(): f32 { | |
return this._note; | |
} | |
next(): void { | |
if(this.env1.state === 4) { | |
this.signal.clear(); | |
return; | |
} | |
const env1: f32 = this.env1.next(); | |
const noiseenv: f32 = this.noiseenv.next(); | |
let lfo: f32 = this.lfo.next(); | |
let osc: f32 = this.osc.next(); | |
osc *= env1; | |
let noiseleft: f32 = this.noise.next() * noiseenv; | |
let noiseright: f32 = this.noise.next() * noiseenv; | |
noiseleft = this.hpfilterl.process(noiseleft); | |
noiseright = this.hpfilterr.process(noiseright); | |
const pan = this._note / 127; | |
this.bandpass.update_frequencies(300,2000 + 1300 * lfo); | |
osc = this.bandpass.process(osc); | |
osc = this.shaper.process(osc); | |
let left = osc * pan; | |
let right = osc * (1 - pan); | |
this.signal.left = left + noiseleft; | |
this.signal.right = right + noiseright; | |
} | |
} | |
const bass = new SawBass3(); | |
const lead = new Eftang(); | |
const kick = new Kick(); | |
const snare = new Rimshot(); | |
const hihat = new Hihat(); | |
const brassylead = new BrassyLead(); | |
const pads: FlatPad[] = createInstrumentArray<FlatPad>(4, () => new FlatPad()); | |
const sinelead = new SineLead(); | |
export function setChannelValue(channel: usize, value: f32): void { | |
switch(channel) { | |
case 0: | |
bass.note = value; | |
break; | |
case 1: | |
lead.note = value; | |
break; | |
case 2: | |
kick.note = value; | |
break; | |
case 3: | |
snare.note = value; | |
break; | |
case 4: | |
hihat.note = value; | |
break; | |
case 5: | |
brassylead.note = value; | |
break; | |
case 6: | |
case 7: | |
case 8: | |
case 9: | |
pads[channel-6].note = value; | |
break; | |
case 10: | |
sinelead.note = value; | |
break; | |
} | |
} | |
const mainline = new StereoSignal(); | |
const reverbline = new StereoSignal(); | |
const padsline = new StereoSignal(); | |
const freeverb = new Freeverb(); | |
const shaper = new WaveShaper(); | |
shaper.drive = 0.4; | |
let eqbandl = new EQBand(20, 19500); | |
let eqbandr = new EQBand(20, 19500); | |
export function mixernext(leftSampleBufferPtr: usize, rightSampleBufferPtr: usize): void { | |
let left: f32 = 0; | |
let right: f32 = 0; | |
mainline.clear(); | |
reverbline.clear(); | |
bass.next(); | |
mainline.addStereoSignal(bass.signal, 0.2, 0.5); | |
// reverbline.addStereoSignal(bass.signal, 0.1, 0.5); | |
lead.next(); | |
mainline.addStereoSignal(lead.signal, 0.2, 0.5); | |
// reverbline.addStereoSignal(lead.signal, 0.1, 0.5); | |
kick.next(); | |
mainline.addStereoSignal(kick.signal, 0.2, 0.5); | |
snare.next(); | |
mainline.addStereoSignal(snare.signal, 1.0, 0.5); | |
// reverbline.addStereoSignal(snare.signal, 0.1, 0.5); | |
hihat.next(); | |
mainline.addStereoSignal(hihat.signal, 0.2, 0.5); | |
brassylead.next(); | |
mainline.addStereoSignal(brassylead.signal, 0.5, 0.5); | |
reverbline.addStereoSignal(brassylead.signal, 0.1, 0.5); | |
sinelead.next(); | |
mainline.addStereoSignal(sinelead.signal, 0.5, 0.5); | |
reverbline.addStereoSignal(sinelead.signal, 0.5, 0.5); | |
padsline.clear(); | |
pads.forEach(pad => { | |
pad.next(); | |
padsline.addStereoSignal(pad.signal, 0.5, 0.5); | |
}); | |
padsline.left = shaper.process(padsline.left); | |
padsline.right = shaper.process(padsline.right); | |
mainline.addStereoSignal(padsline, 0.5, 0.5); | |
reverbline.addStereoSignal(padsline, 0.1, 0.5); | |
freeverb.tick(reverbline); | |
left = gain * (mainline.left + reverbline.left ); | |
right = gain * (mainline.right + reverbline.right ); | |
left = eqbandl.process(left); | |
right = eqbandr.process(right); | |
store<f32>(leftSampleBufferPtr, left); | |
store<f32>(rightSampleBufferPtr, right); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment