internal ControlValue(ControlChange change, ControlInfo info, object?value) { Debug.Assert(ReferenceEquals(change.Control, info.Control)); Change = change; Info = info; Value = value; }
private void TimerThreadStart() { var stopwatch = new Stopwatch(); while (true) { stopwatch.Restart(); if (!TrySendOldest(_controlChangeMessages.Values, msg => ControlChange?.Invoke(msg))) { TrySendOldest(_nrpnMessages.Values, msg => Nrpn?.Invoke(msg)); } // Sleep var remainingTicks = (int)(UpdateInterval - stopwatch.ElapsedMilliseconds); if (_stopTimerEvent.WaitOne(Math.Max(0, remainingTicks))) { break; } } }
private TrackEvent ReadTrackEvent() { var deltaTime = ReadVariableLengthEncoding(); // "Running Status": The last status byte is implied var statusByte = _lastStatusByte; var firstByte = _source.ReadByte(); // Check for new status byte if ((firstByte & 0x80) == 1) { statusByte = firstByte; firstByte = _source.ReadByte(); } var statusUpper = statusByte >> 4; // Save running status if (statusUpper > 0x7 && statusUpper < 0xF) { _lastStatusByte = statusByte; } // Parse the event var statusLower = (byte)(statusByte & 0xF); MidiEvent ev = null; switch (statusUpper) { case 0x8: ev = new NoteOff(statusLower, firstByte, _source.ReadByte()); break; case 0x9: ev = new NoteOn(statusLower, firstByte, _source.ReadByte()); break; case 0xA: ev = new PolyphonicKeyPressure(statusLower, firstByte, _source.ReadByte()); break; case 0xB: if (firstByte < 120) { ev = new ControlChange(statusLower, firstByte, _source.ReadByte()); } else { ev = new ChannelMode(statusLower, firstByte, _source.ReadByte()); } break; case 0xC: ev = new ProgramChange(statusLower, firstByte); break; case 0xD: ev = new ChannelPressure(statusLower, firstByte); break; case 0xE: ev = new PitchBend(statusLower, firstByte, _source.ReadByte()); break; case 0xF: switch (statusLower) { case 0x0: case 0x7: ev = new SysEx(statusLower == 0, _source.ReadBytes(ReadVariableLengthEncoding(firstByte))); break; case 0xF: var len = ReadVariableLengthEncoding(); var data = _source.ReadBytes(len); switch (firstByte) { case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: case 0x08: case 0x09: case 0x0A: case 0x0B: case 0x0C: case 0x0D: case 0x0E: case 0x0F: ev = new TextEvent(Encoding.UTF8.GetString(data)); // TODO: Let user choose encoding break; case 0x20: ev = new ChannelPrefix(data[0]); break; case 0x2F: ev = new EndOfTrack(); break; case 0x51: ev = new SetTempo(MidiBytesConverter.ReadBigEndian24Bit(data)); break; case 0x54: ev = new SmpteOffset((byte)((data[0] >> 5) & 0x3), (byte)(data[0] & 0x1F), data[1], data[2], data[3], data[4]); break; case 0x58: ev = new TimeSignature(data[0], data[1], data[2], data[3]); break; case 0x59: ev = new KeySignature((sbyte)data[0], data[1] == 1); break; case 0x7F: ev = new SequencerSpecificMetaEvent(data); break; default: // TODO: Unrecognized metadata kind, non-fatal error break; } break; default: // At this point, if the event was not recognized: FATAL ERROR! throw new NotImplementedException(); } break; default: // At this point, if the event was not recognized: FATAL ERROR! throw new NotImplementedException(); } return(new TrackEvent(deltaTime, ev)); }
private void HandleControlChange(MidiController controller, int controllerValue) { ControlChange?.Invoke(controller, controllerValue); }
private MIDI ConvertToFormat1(MIDI src) { try { Track srcTrack = src.TrackList[0]; var newTracks = new List <Track>(); int cnt = 0; // event counter var eventlist = new LinkedList <Event>(); uint deltaTime = 0; // Create Conductor track foreach (Event ev in srcTrack.EventList) { deltaTime += ev.DeltaTime; if (ev is MetaEvent) { MetaEvent modEv; if (ev is SetTempo) { var st = (SetTempo)ev; modEv = new SetTempo(deltaTime, st.Value); } else if (ev is TimeSignature) { var ts = (TimeSignature)ev; modEv = new TimeSignature(deltaTime, ts.Numerator, ts.DenominatorBitShift, ts.MIDIClockPerMetronomeTick, ts.NumberOfNotesPerClocks); } else if (ev is KeySignature) { var ks = (KeySignature)ev; modEv = new KeySignature(deltaTime, ks.SignatureNumber, ks.MinorFlagNumber); } else if (ev is SequenceTrackName) { var stn = (SequenceTrackName)ev; modEv = new SequenceTrackName(deltaTime, stn.Name); } else if (ev is EndOfTrack) { modEv = new EndOfTrack(deltaTime); } else { modEv = new MetaEvent(deltaTime); } eventlist.AddLast(modEv); deltaTime = 0; if (!(ev is EndOfTrack)) { cnt++; } } } newTracks.Add(new Track(eventlist)); eventlist = new LinkedList <Event>(); deltaTime = 0; // Create System Setup track foreach (Event ev in srcTrack.EventList) { deltaTime += ev.DeltaTime; if (ev is SysExEvent) { eventlist.AddLast(new SysExEvent(deltaTime)); deltaTime = 0; cnt++; } else if (ev is EndOfTrack) { eventlist.AddLast(new EndOfTrack(deltaTime)); } } newTracks.Add(new Track(eventlist)); // Create Notes track for (int ch = 0; cnt + 1 < srcTrack.EventList.Count; ch++) { eventlist = new LinkedList <Event>(); deltaTime = 0; foreach (Event ev in srcTrack.EventList) { deltaTime += ev.DeltaTime; if (ev is MIDIEvent) { var midiEv = (MIDIEvent)ev; if (midiEv.Channel == ch) { MIDIEvent modEv; if (midiEv is NoteOn) { var nton = (NoteOn)midiEv; modEv = new NoteOn(deltaTime, nton.Channel, nton.Number, nton.Velocity); } else if (midiEv is NoteOff) { var ntoff = (NoteOff)midiEv; modEv = new NoteOff(deltaTime, ntoff.Channel, ntoff.Number, ntoff.Velocity); } else if (midiEv is ProgramChange) { var pc = (ProgramChange)midiEv; modEv = new ProgramChange(deltaTime, pc.Channel, pc.Number); } else if (midiEv is Volume) { var vol = (Volume)midiEv; modEv = new Volume(deltaTime, vol.Channel, vol.Value); } else if (midiEv is Pan) { var pan = (Pan)midiEv; modEv = new Pan(deltaTime, pan.Channel, pan.Value); } else if (midiEv is ControlChange) { var cc = (ControlChange)midiEv; modEv = new ControlChange(deltaTime, cc.Channel, cc.Value); } else { modEv = new MIDIEvent(deltaTime, midiEv.Channel); } eventlist.AddLast(modEv); deltaTime = 0; cnt++; } } else if (ev is EndOfTrack) { eventlist.AddLast(new EndOfTrack(deltaTime)); } } newTracks.Add(new Track(eventlist)); } return(new MIDI(newTracks, 1, newTracks.Count, src.TimeDivision)); } catch (Exception ex) { throw new Exception(Resources.ErrorMIDIFormat1, ex); } }
public Excavate_Form() { InitializeComponent(); controlChange = new ControlChange(ListViewAdd); }