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; }
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; }
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); } }
/// <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) { } } }
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; }