/* * SMF to SEQ * * Convert Standard MIDI file to event array * Output file as sequence.h: to be compiled with ino files * * This program uses part of jasmid to decode and parse .mid files * Please refer to jasmid/LICENSE for the jasmid license * * Run this file with node.js * $ node smf2seq.js [SMF filename] * * 2016 by ilufang */ Midifile = require("./jasmid/midifile.js"); fs = require("fs"); // # Read and parse SMF var filename = process.argv[2]?process.argv[2]:"song.mid"; var midi_blob = fs.readFileSync(filename); var t = ""; for (var i=0; i 127) seq[i].velocity = 127; notes.push(seq[i].noteNumber); note_params.push((seq[i].deltaTime<<4)+(seq[i].velocity>>3)); } } } fs.writeFileSync("midi.json", JSON.stringify(seq, null, '\t')); // # Generate sin table var file = "// MIDI events\n// Generated by smf2seq.js\n"; var sine_sample = [], sine_sample_size = 256; for (var i = 0; i < sine_sample_size; i++) { sine_sample.push(128+Math.round(128*Math.sin(2*Math.PI*i/sine_sample_size))); } file += "const unsigned char sine[] = {"+sine_sample.join(",")+"};\n"; file += "#define TEMPO "+tempo+"\n"; file += "#define SONG_LEN "+notes.length+"\n"; file += "PROGMEM const unsigned char notes[] = {"+notes.join(",")+"};\n"; file += "PROGMEM const int params[] = {"+note_params.join(",")+"};\n"; console.log("Using memory: "+(notes.length*3)); console.log("Total memory: 32256"); // # Write to file fs.writeFileSync("sequence.h",file);