static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine("Usage AlphaTab.ScoreDump.exe PathToFile PathToSoundFont"); return; } // load score var score = ScoreLoader.LoadScoreFromBytes(File.ReadAllBytes(args[0])); // generate midi var midiFile = new MidiFile(); var handler = new AlphaSynthMidiFileHandler(midiFile); var generator = new MidiFileGenerator(score, null, handler); generator.Generate(); var player = new AlphaSynth(new NAudioSynthOutput()); player.MidiLoaded += () => { Console.WriteLine("Midi loaded"); }; player.SoundFontLoaded += () => { Console.WriteLine("SoundFont loaded"); }; player.MidiLoadFailed += e => { Console.WriteLine("Midi load failed"); }; player.SoundFontLoadFailed += e => { Console.WriteLine("SoundFont load failed"); }; player.Finished += _ => { Console.WriteLine("Playback finished"); ((NAudioSynthOutput)player.Output).Close(); }; player.PositionChanged += e => { TimeSpan currentTime = TimeSpan.FromMilliseconds(e.CurrentTime); TimeSpan endTime = TimeSpan.FromMilliseconds(e.EndTime); Console.CursorTop--; Console.Write("".PadLeft(Console.BufferWidth - 1, ' ')); Console.CursorLeft = 0; Console.WriteLine("{0:mm\\:ss\\:fff} ({1}) of {2:mm\\:ss\\:fff} ({3})", currentTime, e.CurrentTick, endTime, e.EndTick); }; player.ReadyForPlayback += () => { Console.WriteLine("Ready for playback"); }; player.LoadSoundFont(File.ReadAllBytes(args[1])); player.LoadMidi(midiFile); Console.WriteLine("Start playing"); player.Play(); Console.WriteLine("Press enter to exit"); Console.ReadLine(); player.Pause(); Console.ReadLine(); }
internal static async Task <(MidiFile, Dictionary <int, Dictionary <long, string> >)> GetSynthMidi(this BmpSong song) { var file = new MidiFile { Division = 600 }; var events = new AlphaSynthMidiFileHandler(file); events.AddTempo(0, 100); var trackCounter = byte.MinValue; var veryLast = 0L; var midiFile = await song.GetProcessedMidiFile(); var trackChunks = midiFile.GetTrackChunks().ToList(); var lyrics = new Dictionary <int, Dictionary <long, string> >(); var lyricNum = 0; foreach (var trackChunk in trackChunks) { var options = trackChunk.Events.OfType <SequenceTrackNameEvent>().First().Text.Split(':'); switch (options[0]) { case "lyric": { if (!lyrics.ContainsKey(lyricNum)) { lyrics.Add(lyricNum, new Dictionary <long, string>(int.Parse(options[1]))); } foreach (var lyric in trackChunk.GetTimedEvents().Where(x => x.Event.EventType == MidiEventType.Lyric)) { lyrics[lyricNum].Add(lyric.Time, ((LyricEvent)lyric.Event).Text); } lyricNum++; break; } case "tone": { var tone = InstrumentTone.Parse(options[1]); foreach (var note in trackChunk.GetNotes()) { var instrument = tone.GetInstrumentFromChannel(note.Channel); var noteNum = note.NoteNumber; var dur = (int)MinimumLength(instrument, noteNum - 48, note.Length); var time = (int)note.Time; events.AddProgramChange(trackCounter, time, trackCounter, (byte)instrument.MidiProgramChangeCode); events.AddNote(trackCounter, time, dur, noteNum, DynamicValue.FFF, trackCounter); if (trackCounter == byte.MaxValue) { trackCounter = byte.MinValue; } else { trackCounter++; } if (time + dur > veryLast) { veryLast = time + dur; } } break; } } } events.FinishTrack(byte.MaxValue, (byte)veryLast); return(file, lyrics); }