so js free to use midi to funcbeat converter
put ur midi in the same folder as code name it song.mid and run the
program then take the code from output.txt and paste it to the
funcbeat, done!
if someone can do better, please do, ik its possible to do much
better
(if someone wants details its just midi player with use of base64
encrypted midi song)
const fs = require('fs');
const midiBuffer = fs.readFileSync('song.mid');
const midiBytes = Array.from(midiBuffer);
var midiString = Buffer.from(midiBytes).toString('base64');
let code = `
var BASE64_CHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
function base64ToBytes(str){var clean=(str||"").replace(/=+$/,""),out=[];for(var i=0;i<clean.length;i+=4){var n=(BASE64_CHARS.indexOf(clean.charAt(i))<<18)|(BASE64_CHARS.indexOf(clean.charAt(i+1))<<12)|(BASE64_CHARS.indexOf(clean.charAt(i+2)||'A')<<6)|(BASE64_CHARS.indexOf(clean.charAt(i+3)||'A'));out.push((n>>16)&0xFF);if(clean.charAt(i+2)&&clean.charAt(i+2)!=='=')out.push((n>>8)&0xFF);if(clean.charAt(i+3)&&clean.charAt(i+3)!=='=')out.push(n&0xFF);}return out;}
function readVarLen(bytes,i){var value=0,b;do{b=bytes[i++];value=(value<<7)|(b&0x7F);}while(b&0x80);return {value,nextIndex:i};}
function splitTracks(bytes){var i=0;if(String.fromCharCode(bytes[i],bytes[i+1],bytes[i+2],bytes[i+3])!=='MThd')throw new Error('Invalid MIDI header');var hl=(bytes[i+4]<<24)|(bytes[i+5]<<16)|(bytes[i+6]<<8)|bytes[i+7];var format=(bytes[i+8]<<8)|bytes[i+9],nTracks=(bytes[i+10]<<8)|bytes[i+11],tpq=(bytes[i+12]<<8)|bytes[i+13];i+=8+hl;var tracks=[];for(var t=0;t<nTracks;t++){if(String.fromCharCode(bytes[i],bytes[i+1],bytes[i+2],bytes[i+3])!=='MTrk')throw new Error('Invalid track header');var tl=(bytes[i+4]<<24)|(bytes[i+5]<<16)|(bytes[i+6]<<8)|bytes[i+7];tracks.push(bytes.slice(i+8,i+8+tl));i+=8+tl;}return{format,tpq,tracks};}
function parseTrackToEvents(bytes){var events=[],i=0,tick=0,lastStatus=null;while(i<bytes.length){var dt=readVarLen(bytes,i);tick+=dt.value;i=dt.nextIndex;if(i>=bytes.length)break;var statusByte=bytes[i],status;if(statusByte>=0x80){status=statusByte;lastStatus=status;i++;}else{if(!lastStatus)break;status=lastStatus;}var cmd=status&0xF0,channel=status&0x0F;if(status===0xFF){var mt=bytes[i++],lenInfo=readVarLen(bytes,i),len=lenInfo.value;i=lenInfo.nextIndex+len;if(mt===0x51&&len===3){var tempo=(bytes[i-3]<<16)|(bytes[i-2]<<8)|bytes[i-1];events.push({tick,type:"setTempo",tempo});}continue;}if(cmd===0xC0){var program=bytes[i++];events.push({tick,type:"programChange",channel,program});continue;}if(cmd===0x90||cmd===0x80){var d1=bytes[i++],d2=bytes[i++];if(cmd===0x90&&d2>0)events.push({tick,type:"noteOn",note:d1,velocity:d2,channel});else events.push({tick,type:"noteOff",note:d1,channel});continue;}if(cmd===0xA0||cmd===0xB0||cmd===0xE0){i+=2;continue;}if(cmd===0xD0){i+=1;continue;}i++;}return events;}
function ticksToSecondsAndNotes(bytes){var midi=splitTracks(bytes),tpq=midi.tpq,all=[];for(var t=0;t<midi.tracks.length;t++){var evs=parseTrackToEvents(midi.tracks[t]);for(var k=0;k<evs.length;k++)all.push(evs[k]);}all.sort((a,b)=>a.tick-b.tick);var tempo=500000;for(var i=0;i<all.length;i++){if(all[i].type==="setTempo"){tempo=all[i].tempo;break;}}var lastTick=0,lastSec=0;for(var i=0;i<all.length;i++){var ev=all[i];var dt=ev.tick-lastTick;var secDelta=(dt*tempo)/(tpq*1000000);lastSec+=secDelta;ev.time=lastSec;if(ev.type==="setTempo")tempo=ev.tempo;lastTick=ev.tick;}var notes=[],openNotes={},channelPrograms=new