_profile

onlinesequencer custom ppq midi export

May 10th, 2025 (edited)
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.35 KB | None | 0 0
  1. export_ppq = 960 -- change this to watever
  2.  
  3. function exportMidi2(){let title=getTitle();let channelId=0;let lastTime=0;function eventTime(time){const diff=time-lastTime;lastTime=time;return new Midi.Delta(Math.round(diff*(export_ppq/4)))}
  4. function createMidiInstrumentTrack(instId,track){lastTime=0;const baseInstId=instMgr.baseId(instId);const instVolume=song.settings.instruments[instId]?.volume??1;let instDetune=song.settings.instruments[instId]?.detune??0;let notes=[];for(let note of song.notes.filter(n=>n.instrument===instId)){notes.push({type:note.type,time:note.time,length:note.length,volume:Math.max(note.volume*instVolume*50,0)})}
  5. if(notes.length===0)
  6. return;notes.sort((a,b)=>a.time<b.time?-1:1);let events=[];for(let note of notes){events.push([{time:note.time,type:note.type,isOn:!0,},note.volume,]);events.push([{time:note.time+note.length,type:note.type,isOn:!1,},0,])}
  7. events.sort((a,b)=>{if(a[0].time===b[0].time){return a[0].isOn?1:-1}
  8. return a[0].time<b[0].time?-1:1});let channel;if(instMgr.isDrum(instId)){channel=9}else{channel=channelId;channelId++;if(channelId===9){channelId++}}
  9. track.appendEvent(new Midi.Event.TrackNameEvent(getInstrumentName(song,instId)));track.appendEvent(new Midi.Event.ProgramChangeEvent(channel,settings.midiInstrumentMap[baseInstId]-1));let map;if(baseInstId===36){map=Midi.drumKit808Map}else if(baseInstId===39){map=Midi.drumKit8BitMap}else if(baseInstId===40){map=Midi.drumKit2013Map}else if(baseInstId===42){map=Midi.drumKit909Map}else{map=midiNoteNamesToIndex}
  10. if(channel===9){instDetune=0}
  11. for(let event of events){const delta=eventTime(event[0].time);let pitch=map[event[0].type]+Math.round(instDetune/100);if(map===midiNoteNamesToIndex)pitch-=12;const noteEvent=event[0].isOn?new Midi.Event.NoteOnEvent(channel,pitch,event[1]):new Midi.Event.NoteOffEvent(channel,pitch,0);track.appendEvent(noteEvent,delta)}
  12. track.appendEvent(new Midi.Event.EndOfTrackEvent());return track}
  13. let mpqn=1/(bpm/60)*1_000_000;let file=new Midi.File(export_ppq);let first=!0;for(let i of new Set(song.notes.map(n=>n.instrument))){let track=new Midi.Track();if(first){track.appendEvent(new Midi.Event.TimeSignatureEvent(getTimeSig(),4));track.appendEvent(new Midi.Event.SetTempoEvent(mpqn));first=!1}
  14. createMidiInstrumentTrack(i,track);file.addTrack(track)}
  15. let data=file.getData();saveBlob(title+'.mid',[new Uint8Array(data)],'audio/midi')};
  16.  
  17. exportMidi2()
Advertisement
Add Comment
Please, Sign In to add comment