コード例 #1
0
ファイル: TrackReader.cs プロジェクト: k-l-lambda/pianist
        private void ParseChannelMessage()
        {
            if (trackIndex >= trackData.Length)
            {
                throw new MidiFileException("End of track unexpectedly reached.");
            }

            cmBuilder.Command     = ChannelMessage.UnpackCommand(status);
            cmBuilder.MidiChannel = ChannelMessage.UnpackMidiChannel(status);
            cmBuilder.Data1       = trackData[trackIndex];

            trackIndex++;

            if (ChannelMessage.DataBytesPerType(cmBuilder.Command) == 2)
            {
                if (trackIndex >= trackData.Length)
                {
                    throw new MidiFileException("End of track unexpectedly reached.");
                }

                cmBuilder.Data2 = trackData[trackIndex];

                trackIndex++;
            }

            cmBuilder.Build();
            newTrack.Insert(ticks, cmBuilder.Result);
            runningStatus = status;
        }
コード例 #2
0
        private void ParseChannelMessage()
        {
            if (trackIndex >= trackData.Length)
            {
                throw new MidiFileException("End of track unexpectedly reached.");
            }

            var command = ChannelMessage.UnpackCommand(status);
            var channel = ChannelMessage.UnpackMidiChannel(status);
            var data1   = trackData[trackIndex];

            trackIndex++;
            var data2 = 0;

            if (ChannelMessage.DataBytesPerType(command) == 2)
            {
                if (trackIndex >= trackData.Length)
                {
                    throw new MidiFileException("End of track unexpectedly reached.");
                }

                data2 = trackData[trackIndex];

                trackIndex++;
            }

            newTrack.Insert(ticks, new ChannelMessage(command, data1, data2, channel));
            runningStatus = status;
        }
コード例 #3
0
        private void Write(ChannelMessage message)
        {
            if (runningStatus != message.Status)
            {
                trackData.Add((byte)message.Status);
                runningStatus = message.Status;
            }

            trackData.Add((byte)message.Data1);

            if (ChannelMessage.DataBytesPerType(message.Command) == 2)
            {
                trackData.Add((byte)message.Data2);
            }
        }
コード例 #4
0
        /// <summary>
        /// Write notes
        /// </summary>
        /// <param name="message"></param>
        /// <param name="trackid"></param>
        /// <param name="ticks"></param>
        /// <param name="channel"></param>
        private void Write(ChannelMessage message, int trackid, int ticks, int channel)
        {
            if (runningStatus != message.Status)
            {
                runningStatus = message.Status;
            }

            if (ChannelMessage.DataBytesPerType(message.Command) == 2)
            {
                if (message.Command == ChannelCommand.NoteOn)
                {
                    // Track, Time, Note_on_c, Channel, Note, Velocity
                    stream.WriteLine(string.Format("{0}, {1}, Note_on_c, {2}, {3}, {4}", trackid, ticks, channel, message.Data1, message.Data2));
                }
                else if (message.Command == ChannelCommand.NoteOff)
                {
                    // Track, Time, Note_off_c, Channel, Note, Velocity = 0
                    stream.WriteLine(string.Format("{0}, {1}, Note_off_c, {2}, {3}, 0", trackid, ticks, channel, message.Data1));
                }
                else if (message.Command == ChannelCommand.PitchWheel)
                {
                }
            }
        }
コード例 #5
0
        private void ParseChannelMessage()
        {
            if (trackIndex >= trackData.Length)
            {
                //throw new MidiFileException("End of track unexpectedly reached.");
                Console.Write("\nERROR: End of track unexpectedly reached (TrackReader.cs ParseChannelMessage)");
                return;
            }

            cmBuilder.Command     = ChannelMessage.UnpackCommand(status);
            cmBuilder.MidiChannel = ChannelMessage.UnpackMidiChannel(status);
            cmBuilder.Data1       = trackData[trackIndex];

            // PROGRAM CHANGE
            if (cmBuilder.Command == ChannelCommand.ProgramChange)
            {
                newTrack.ProgramChange = cmBuilder.Data1;
                newTrack.MidiChannel   = cmBuilder.MidiChannel;
            }

            trackIndex++;

            if (ChannelMessage.DataBytesPerType(cmBuilder.Command) == 2)
            {
                if (trackIndex >= trackData.Length)
                {
                    //throw new MidiFileException("End of track unexpectedly reached.");
                    Console.Write("\nERROR: End of track unexpectedly reached (TrackReader.cs ParseChannelMessage)");
                    return;
                }

                // FAB : 07/08/2014
                if (trackData[trackIndex] <= 127)
                {
                    cmBuilder.Data2 = trackData[trackIndex];
                }
                else
                {
                    cmBuilder.Data2 = 127;
                }

                if (cmBuilder.Data1 == 0x07)
                {
                    // Volume de la piste
                    newTrack.Volume = cmBuilder.Data2;
                }
                else if (cmBuilder.Data1 == 0x5B)
                {
                    // Reverb 91
                    // FAB 2017
                    newTrack.Reverb = cmBuilder.Data2;
                }
                else if (cmBuilder.Data1 == 0x0A)
                {
                    // pan 10
                    // FAB 2017
                    newTrack.Pan = cmBuilder.Data2;
                }

                // Collecte des notes
                if (cmBuilder.Command == ChannelCommand.NoteOn)
                {
                    newTrack.ContainsNotes = true;
                    newTrack.Visible       = true;

                    // Data1 = Note number
                    // Data2 = Velocity
                    if (ticks >= 0 && cmBuilder.Data2 > 0)
                    {
                        // FAB :
                        // Add a MidiNote to this track.  This is called for each NoteOn event */
                        newTrack.MidiChannel = cmBuilder.MidiChannel;

                        MidiNote note = new MidiNote(ticks, newTrack.MidiChannel, cmBuilder.Data1, 0, cmBuilder.Data2, false);
                        newTrack.Notes.Add(note);
                    }
                    else
                    {
                        // FAB
                        if (newTrack.Notes.Count > 0)
                        {
                            newTrack.MidiChannel = cmBuilder.MidiChannel;
                            NoteOff(newTrack.MidiChannel, cmBuilder.Data1, ticks);
                        }
                    }
                }
                else if (ticks >= 0 && cmBuilder.Command == ChannelCommand.NoteOff)
                {
                    // FAB
                    newTrack.ContainsNotes = true;
                    newTrack.Visible       = true;

                    newTrack.MidiChannel = cmBuilder.MidiChannel;
                    NoteOff(newTrack.MidiChannel, cmBuilder.Data1, ticks);
                }
                trackIndex++;
            }
            cmBuilder.Build();
            newTrack.Insert(ticks, cmBuilder.Result);

            runningStatus = status;
        }