Advertisement
henke37

Midi player driver

Aug 11th, 2014
504
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package  {
  2.    
  3.     import flash.display.*;
  4.     import flash.net.*;
  5.     import flash.events.*;
  6.     import flash.utils.*;
  7.     import flash.media.*;
  8.     import flash.system.*;
  9.    
  10.     import HTools.Audio.DLS.*;
  11.     import HTools.Audio.Midi.*;
  12.     import HTools.Audio.MidiPlayer.Player;
  13.     import HTools.Audio.Midi.Events.MidiEvent;
  14.     import HTools.Audio.MidiPlayer.Instrument;
  15.     import HTools.Audio.MidiPlayer.InstrumentRegion;
  16.     import HTools.Audio.MidiPlayer.Sample;
  17.     import HTools.Audio.WaveWriter;
  18.    
  19.     public class MidiPlayerTest extends Sprite {
  20.        
  21.         private var dlsLoader:URLLoader;
  22.         private var dlsParser:DLSArchive;
  23.        
  24.         private var midiLoader:URLLoader;
  25.         private var midiParser:MidiLoader;
  26.        
  27.         private var player:Player;
  28.        
  29.         private static const GMPATH:String="C:\\windows\\system32\\drivers\\gm.dls";
  30.        
  31.         private static const SONG:String="canyon.mid";
  32.        
  33.         private var outSound:Sound;
  34.         private var outSoundChan:SoundChannel;
  35.        
  36.         private static const PUMP_LEN:uint=8000;
  37.        
  38.         public function MidiPlayerTest() {
  39.             dlsLoader=new URLLoader();
  40.             dlsLoader.dataFormat=URLLoaderDataFormat.BINARY;
  41.             dlsLoader.addEventListener(Event.COMPLETE,dlsLoaded);
  42.             dlsLoader.load(new URLRequest(GMPATH));
  43.            
  44.             midiLoader=new URLLoader();
  45.             midiLoader.dataFormat=URLLoaderDataFormat.BINARY;
  46.             midiLoader.addEventListener(Event.COMPLETE,midiLoaded);
  47.             midiLoader.load(new URLRequest(SONG));
  48.         }
  49.        
  50.         private function dlsLoaded(e:Event):void {
  51.             const data:ByteArray=dlsLoader.data;
  52.             trace("DLS loaded");
  53.            
  54.             const startTime:uint=getTimer();
  55.             dlsParser=new DLSArchive();
  56.             dlsParser.parse(data);
  57.            
  58.             trace("DLS Parsing took ",getTimer()-startTime," ms.");
  59.            
  60.             loaded();
  61.         }
  62.        
  63.         private function midiLoaded(e:Event):void {
  64.             const data:ByteArray=midiLoader.data;
  65.             trace("MIDI loaded");
  66.            
  67.            
  68.             const startTime:uint=getTimer();           
  69.             midiParser=new MidiLoader();
  70.             midiParser.parse(data);
  71.             trace("Loaded ",midiParser.tracks.length,"tracks");
  72.            
  73.             trace("Track 0 has",midiParser.tracks[0].length,"events");
  74.            
  75.             trace("MIDI Parsing took ",getTimer()-startTime," ms.");
  76.            
  77.             loaded();
  78.         }
  79.        
  80.         private var loadCount:uint;
  81.         private function loaded():void {
  82.             if(++loadCount<2) return;
  83.            
  84.             var startTime:uint=getTimer(); 
  85.             player=new Player();
  86.             player.tickRate=midiParser.tickRate;
  87.             trace("Player instantiation took ",getTimer()-startTime," ms.");
  88.            
  89.             startTime=getTimer();
  90.             player.loadDLS(dlsParser);
  91.             trace("Player DLS loading took ",getTimer()-startTime," ms.");
  92.            
  93.             player.requestMoreEvents=stuffEvents;
  94.            
  95.             /* List instruments
  96.             for each(var inst:Instrument in player.instrumentLoader.instruments) {
  97.                 trace(inst.name,inst.instrumentId,inst.bankHigh,inst.bankLow);
  98.             }*/
  99.            
  100.             //dumpEvents();
  101.             //testSampleLoading();
  102.             testExecuteEvents(false);
  103.             //testExecuteEvents(true);
  104.             //testPlayback();
  105.         }
  106.        
  107.         private function dumpEvents():void {
  108.             var track:Vector.<MidiEvent>=midiParser.tracks[0];
  109.             for each(var evt:MidiEvent in track) {
  110.                 trace(evt);
  111.             }
  112.         }
  113.        
  114.         private function testSampleLoading():void {
  115.             const inst:Instrument=player.instrumentLoader.instruments[0];
  116.             const region:InstrumentRegion=inst.regions[0];
  117.             const sample:Sample=region.sample;
  118.             sample.loadSampleData();
  119.            
  120.             var writer:WaveWriter=new WaveWriter(sample.fmt.channels==2,32,sample.sampleRate);
  121.             sample.sampleData.position=0;
  122.             writer.addSamples(sample.sampleData);
  123.             writer.finalize();
  124.            
  125.             var fr:FileReference=new FileReference();
  126.             fr.save(writer.outBuffer,"sample.wav");
  127.         }
  128.        
  129.         private function testExecuteEvents(saveData:Boolean):void {
  130.             const startTime:uint=getTimer();
  131.            
  132.             const testLen:uint=100000;
  133.            
  134.             const ob:ByteArray=new ByteArray();
  135.             ob.length=testLen*8;
  136.             player.executeEvents(testLen,ob);
  137.             ob.position=0;
  138.            
  139.             const takenTime:uint=getTimer()-startTime;
  140.             const budget:uint=testLen/44100;
  141.             const ratio:Number=takenTime/budget;
  142.             trace("Running events took ",takenTime," ms.",(ratio*100).toFixed(2),"%");
  143.            
  144.             if(saveData) {
  145.                 var writer:WaveWriter=new WaveWriter(true,32,44100);
  146.                 ob.position=0;
  147.                 writer.addSamples(ob);
  148.                 writer.finalize();
  149.                
  150.                 var fr:FileReference=new FileReference();
  151.                 fr.save(writer.outBuffer,"sample.wav");
  152.             }
  153.         }
  154.        
  155.         private function testPlayback():void {
  156.             outSound=new Sound();
  157.             outSound.addEventListener(SampleDataEvent.SAMPLE_DATA,pumpSamples);
  158.             outSoundChan=outSound.play();
  159.         }
  160.        
  161.         private function pumpSamples(e:SampleDataEvent):void {
  162.             e.data.length=PUMP_LEN*4*2;
  163.             e.data.position=0;
  164.             player.executeEvents(PUMP_LEN,e.data);
  165.             //e.data.position=0;
  166.         }
  167.        
  168.         private function stuffEvents(events:Vector.<MidiEvent>):void {
  169.            
  170.             for each(var event:MidiEvent in midiParser.tracks[0]) {
  171.                 events.push(event);
  172.             }
  173.         }
  174.     }
  175.    
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement