Example #1
0
        internal Gp7Importer PrepareGp7ImporterWithBytes(byte[] buffer)
        {
            var readerBase = new Gp7Importer();

            readerBase.Init(ByteBuffer.FromBuffer(buffer));
            return(readerBase);
        }
Example #2
0
        public void TestGraceBeatGeneration()
        {
            var reader = new Gp7Importer();
            var buffer = TestPlatform.LoadFile("TestFiles/Audio/GraceBeats.gp");

            var settings = Settings.SongBook;

            reader.Init(ByteBuffer.FromBuffer(buffer), settings);
            var score = reader.ReadScore();

            var handler   = new FlatMidiEventGenerator();
            var generator = new MidiFileGenerator(score, settings, handler);

            generator.Generate();

            // on beat
            var tick  = 0;
            var ticks = new FastList <int>();

            Assert.AreEqual(tick, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].AbsolutePlaybackStart);
            Assert.AreEqual(3840, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].PlaybackDuration);
            ticks.Add(tick);
            tick += score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].PlaybackDuration;

            Assert.AreEqual(tick, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[0].AbsolutePlaybackStart);
            Assert.AreEqual(120, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[0].PlaybackDuration);
            ticks.Add(tick);
            tick += score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[0].PlaybackDuration;

            Assert.AreEqual(tick, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[1].AbsolutePlaybackStart);
            Assert.AreEqual(3720, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[1].PlaybackDuration);
            ticks.Add(tick);
            tick += score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[1].PlaybackDuration;

            // before beat
            Assert.AreEqual(tick, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[0].AbsolutePlaybackStart);
            Assert.AreEqual(3720, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[0].PlaybackDuration);
            ticks.Add(tick);
            tick += score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[0].PlaybackDuration;

            Assert.AreEqual(tick, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[0].AbsolutePlaybackStart);
            Assert.AreEqual(120, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[0].PlaybackDuration);
            ticks.Add(tick);
            tick += score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[0].PlaybackDuration;

            Assert.AreEqual(tick, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[1].AbsolutePlaybackStart);
            Assert.AreEqual(3840, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[1].PlaybackDuration);
            ticks.Add(tick);
            tick += score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[1].PlaybackDuration;

            // bend
            Assert.AreEqual(GraceType.BendGrace, score.Tracks[0].Staves[0].Bars[4].Voices[0].Beats[0].GraceType);
            Assert.AreEqual(tick, score.Tracks[0].Staves[0].Bars[4].Voices[0].Beats[0].AbsolutePlaybackStart);
            Assert.AreEqual(1920, score.Tracks[0].Staves[0].Bars[4].Voices[0].Beats[0].PlaybackDuration);
            ticks.Add(tick);
            tick += score.Tracks[0].Staves[0].Bars[4].Voices[0].Beats[0].PlaybackDuration;

            Assert.AreEqual(tick, score.Tracks[0].Staves[0].Bars[4].Voices[0].Beats[1].AbsolutePlaybackStart);
            Assert.AreEqual(1920, score.Tracks[0].Staves[0].Bars[4].Voices[0].Beats[1].PlaybackDuration);
            ticks.Add(tick);
            tick += score.Tracks[0].Staves[0].Bars[4].Voices[0].Beats[1].PlaybackDuration;

            var info           = score.Tracks[0].PlaybackInfo;
            var expectedEvents = new FlatMidiEventGenerator.MidiEvent[]
            {
                // channel init
                new FlatMidiEventGenerator.ControlChangeEvent {
                    Tick = 0, Track = 0, Channel = info.PrimaryChannel, Controller = (byte)ControllerType.VolumeCoarse, Value = 120
                },
                new FlatMidiEventGenerator.ControlChangeEvent {
                    Tick = 0, Track = 0, Channel = info.PrimaryChannel, Controller = (byte)ControllerType.PanCoarse, Value = 64
                },
                new FlatMidiEventGenerator.ControlChangeEvent {
                    Tick = 0, Track = 0, Channel = info.PrimaryChannel, Controller = (byte)ControllerType.ExpressionControllerCoarse, Value = 127
                },
                new FlatMidiEventGenerator.ControlChangeEvent {
                    Tick = 0, Track = 0, Channel = info.PrimaryChannel, Controller = (byte)ControllerType.RegisteredParameterFine, Value = 0
                },
                new FlatMidiEventGenerator.ControlChangeEvent {
                    Tick = 0, Track = 0, Channel = info.PrimaryChannel, Controller = (byte)ControllerType.RegisteredParameterCourse, Value = 0
                },
                new FlatMidiEventGenerator.ControlChangeEvent {
                    Tick = 0, Track = 0, Channel = info.PrimaryChannel, Controller = (byte)ControllerType.DataEntryFine, Value = 0
                },
                new FlatMidiEventGenerator.ControlChangeEvent {
                    Tick = 0, Track = 0, Channel = info.PrimaryChannel, Controller = (byte)ControllerType.DataEntryCoarse, Value = 12
                },
                new FlatMidiEventGenerator.ProgramChangeEvent {
                    Tick = 0, Track = 0, Channel = info.PrimaryChannel, Program = (byte)info.Program
                },

                new FlatMidiEventGenerator.ControlChangeEvent {
                    Tick = 0, Track = 0, Channel = info.SecondaryChannel, Controller = (byte)ControllerType.VolumeCoarse, Value = 120
                },
                new FlatMidiEventGenerator.ControlChangeEvent {
                    Tick = 0, Track = 0, Channel = info.SecondaryChannel, Controller = (byte)ControllerType.PanCoarse, Value = 64
                },
                new FlatMidiEventGenerator.ControlChangeEvent {
                    Tick = 0, Track = 0, Channel = info.SecondaryChannel, Controller = (byte)ControllerType.ExpressionControllerCoarse, Value = 127
                },
                new FlatMidiEventGenerator.ControlChangeEvent {
                    Tick = 0, Track = 0, Channel = info.SecondaryChannel, Controller = (byte)ControllerType.RegisteredParameterFine, Value = 0
                },
                new FlatMidiEventGenerator.ControlChangeEvent {
                    Tick = 0, Track = 0, Channel = info.SecondaryChannel, Controller = (byte)ControllerType.RegisteredParameterCourse, Value = 0
                },
                new FlatMidiEventGenerator.ControlChangeEvent {
                    Tick = 0, Track = 0, Channel = info.SecondaryChannel, Controller = (byte)ControllerType.DataEntryFine, Value = 0
                },
                new FlatMidiEventGenerator.ControlChangeEvent {
                    Tick = 0, Track = 0, Channel = info.SecondaryChannel, Controller = (byte)ControllerType.DataEntryCoarse, Value = 12
                },
                new FlatMidiEventGenerator.ProgramChangeEvent {
                    Tick = 0, Track = 0, Channel = info.SecondaryChannel, Program = (byte)info.Program
                },

                new FlatMidiEventGenerator.TimeSignatureEvent {
                    Tick = 0, Numerator = 4, Denominator = 4
                },
                new FlatMidiEventGenerator.TempoEvent {
                    Tick = 0, Tempo = 120
                },

                // on beat
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[0], Track = 0, Channel = info.PrimaryChannel, Value = 64
                },
                new FlatMidiEventGenerator.NoteEvent {
                    Tick = ticks[0], Track = 0, Channel = info.PrimaryChannel, DynamicValue = DynamicValue.F, Key = (byte)67, Length = 3840
                },

                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[1], Track = 0, Channel = info.PrimaryChannel, Value = 64
                },
                new FlatMidiEventGenerator.NoteEvent {
                    Tick = ticks[1], Track = 0, Channel = info.PrimaryChannel, DynamicValue = DynamicValue.F, Key = (byte)67, Length = 120
                },

                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[2], Track = 0, Channel = info.PrimaryChannel, Value = 64
                },
                new FlatMidiEventGenerator.NoteEvent {
                    Tick = ticks[2], Track = 0, Channel = info.PrimaryChannel, DynamicValue = DynamicValue.F, Key = (byte)67, Length = 3720
                },


                // before beat
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[3], Track = 0, Channel = info.PrimaryChannel, Value = 64
                },
                new FlatMidiEventGenerator.NoteEvent {
                    Tick = ticks[3], Track = 0, Channel = info.PrimaryChannel, DynamicValue = DynamicValue.F, Key = (byte)67, Length = 3720
                },

                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[4], Track = 0, Channel = info.PrimaryChannel, Value = 64
                },
                new FlatMidiEventGenerator.NoteEvent {
                    Tick = ticks[4], Track = 0, Channel = info.PrimaryChannel, DynamicValue = DynamicValue.F, Key = (byte)67, Length = 120
                },

                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[5], Track = 0, Channel = info.PrimaryChannel, Value = 64
                },
                new FlatMidiEventGenerator.NoteEvent {
                    Tick = ticks[5], Track = 0, Channel = info.PrimaryChannel, DynamicValue = DynamicValue.F, Key = (byte)67, Length = 3840
                },

                // bend beat
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[6], Track = 0, Channel = info.SecondaryChannel, Value = 64
                },
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[6] + 13 * 0, Track = 0, Channel = info.SecondaryChannel, Value = 64
                },
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[6] + 13 * 1, Track = 0, Channel = info.SecondaryChannel, Value = 65
                },
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[6] + 13 * 2, Track = 0, Channel = info.SecondaryChannel, Value = 66
                },
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[6] + 13 * 3, Track = 0, Channel = info.SecondaryChannel, Value = 67
                },
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[6] + 13 * 4, Track = 0, Channel = info.SecondaryChannel, Value = 68
                },
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[6] + 13 * 5, Track = 0, Channel = info.SecondaryChannel, Value = 69
                },
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[6] + 13 * 6, Track = 0, Channel = info.SecondaryChannel, Value = 70
                },
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[6] + 13 * 7, Track = 0, Channel = info.SecondaryChannel, Value = 71
                },
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[6] + 13 * 8, Track = 0, Channel = info.SecondaryChannel, Value = 72
                },
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[6] + 13 * 9, Track = 0, Channel = info.SecondaryChannel, Value = 73
                },
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[6] + 13 * 10, Track = 0, Channel = info.SecondaryChannel, Value = 74
                },
                new FlatMidiEventGenerator.BendEvent {
                    Tick = ticks[6] + 13 * 11 + 1, Track = 0, Channel = info.SecondaryChannel, Value = 75
                },
                new FlatMidiEventGenerator.NoteEvent {
                    Tick = ticks[6], Track = 0, Channel = info.SecondaryChannel, Length = 3840, Key = 67, DynamicValue = DynamicValue.F
                },

                // end of track
                new FlatMidiEventGenerator.TrackEndEvent {
                    Tick = 19200, Track = 0
                }                                                                    // 3840 = end of bar
            };

            for (int i = 0; i < handler.MidiEvents.Count; i++)
            {
                Logger.Info("Test", $"i[{i}] {handler.MidiEvents[i]}");
                if (i < expectedEvents.Length)
                {
                    Assert.AreEqual(expectedEvents[i], handler.MidiEvents[i]);
                }
            }

            Assert.AreEqual(expectedEvents.Length, handler.MidiEvents.Count);
        }