Skip to content

Instantly share code, notes, and snippets.

@viking
Last active August 29, 2015 14:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save viking/f2f4aa5df2b653c9a2d3 to your computer and use it in GitHub Desktop.
Save viking/f2f4aa5df2b653c9a2d3 to your computer and use it in GitHub Desktop.
Mario Kart wavepot song
var pitches = {
'B2': 123,
'C3': 131,
'C#3': 139,
'D3': 147,
'D#3': 156,
'E3': 165,
'F3': 175,
'F#3': 185,
'G3': 196,
'G#3': 208,
'A3': 220,
'A#3': 233,
'B3': 247,
'C4': 262,
'C#4': 278,
'D4': 294,
'D#4': 311,
'E4': 330,
'F4': 349,
'F#4': 370,
'G4': 392,
'G#4': 415,
'A4': 440,
'A#4': 466,
'B4': 494,
'C5': 523
}
function Square(gain) {
this.gain = gain;
this.notes = {};
this.length = 0;
}
Square.prototype.addNote = function(pitchName, start, length) {
var stop = start + length;
for (var pos = start; pos < stop; pos += 1) {
this.notes[pos] = pitches[pitchName];
}
if (stop > this.length) {
this.length = stop;
}
};
Square.prototype.dsp = function(pos, t) {
if (pos in this.notes) {
var tone = this.notes[pos];
return this.gain * Math.round(Math.sin(2 * Math.PI * t * tone));
}
return 0;
};
var melody = new Square(0.2);
melody.addNote('E4', 4, 4);
melody.addNote('F4', 8, 2);
melody.addNote('F4', 12, 2);
melody.addNote('G4', 14, 2);
melody.addNote('G4', 18, 2);
melody.addNote('G4', 22, 2);
melody.addNote('A4', 24, 2);
melody.addNote('B4', 26, 2);
melody.addNote('C5', 28, 2);
melody.addNote('E4', 30, 2);
melody.addNote('E4', 36, 4);
melody.addNote('F4', 40, 2);
melody.addNote('F4', 44, 2);
melody.addNote('G4', 46, 2);
melody.addNote('G4', 50, 2);
melody.addNote('G4', 54, 2);
melody.addNote('F4', 56, 2);
melody.addNote('E4', 58, 2);
melody.addNote('D4', 60, 2);
melody.addNote('E4', 62, 2);
var bass = new Square(0.2);
bass.addNote('C3', 0, 2);
bass.addNote('C3', 6, 2);
bass.addNote('D3', 8, 2);
bass.addNote('D3', 14, 2);
bass.addNote('E3', 16, 2);
bass.addNote('E3', 22, 2);
bass.addNote('F3', 24, 4);
bass.addNote('B2', 28, 4);
bass.addNote('C3', 32, 2);
bass.addNote('C3', 38, 2);
bass.addNote('D3', 40, 2);
bass.addNote('D3', 46, 2);
bass.addNote('E3', 48, 2);
bass.addNote('E3', 54, 2);
bass.addNote('D3', 56, 4);
bass.addNote('B2', 60, 4);
var instruments = [melody, bass];
// calculate song length
var songLength = 0;
instruments.forEach(function(instrument) {
if (instrument.length > songLength) {
songLength = instrument.length;
}
});
function dsp(t) {
// calculate beat in eighth notes
var bpm = 100;
var beat = Math.round(t * (bpm / 60) * 8) % songLength;
var tone = 0;
instruments.forEach(function(instrument) {
tone += instrument.dsp(beat, t);
});
return tone;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment