Skip to content

Instantly share code, notes, and snippets.

@petersalomonsen
Last active April 11, 2020 19:10
Show Gist options
  • Save petersalomonsen/6ba8fd149e8bee48a37281ba02cfca45 to your computer and use it in GitHub Desktop.
Save petersalomonsen/6ba8fd149e8bee48a37281ba02cfca45 to your computer and use it in GitHub Desktop.
// 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));
}
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