Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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);
        }