internal Jump(SystemExclusiveEvent e) : base(e) { Id = Util.ReadPackedByteBe(e.Data, 3); Track = Util.ReadPackedInt16Be(e.Data, 5); Beat = Util.ReadPackedInt16Be(e.Data, 9); Tick = Util.ReadPackedInt16Be(e.Data, 13); }
private void MidiInOnReceivedExclusiveMessage(SystemExclusiveEvent sysExEvent) { if (sysExEvent.Data[0] != 0xf0 || sysExEvent.Data[sysExEvent.Data.Length - 1] != 0xf7) { return; } var message = sysExEvent.Data.Skip(1).Take(sysExEvent.Data.Length - 2).ToArray(); // Set Percussion Channel if (message.Length == 9 && message[4] == 0x40 && message[6] == 0x15) { int channel; switch (message[5]) { case 16: channel = 9; break; case 17: channel = 0; break; case 18: channel = 1; break; case 19: channel = 2; break; case 20: channel = 3; break; case 21: channel = 4; break; case 22: channel = 5; break; case 23: channel = 6; break; case 24: channel = 7; break; case 25: channel = 8; break; case 26: channel = 10; break; case 27: channel = 11; break; case 28: channel = 12; break; case 29: channel = 13; break; case 30: channel = 14; break; case 31: channel = 15; break; default: channel = 0; break; } var isPercussion = message[7] != 0; percussionMode[channel] = isPercussion; Console.WriteLine($"Change Chanel Mode: Ch {channel} - {isPercussion}"); } }
/// <inheritdoc /> public void AddRest(int track, int tick, int channel) { var message = new SystemExclusiveEvent(tick, (byte)SystemCommonTypeEnum.SystemExclusive, 0, new byte[] { 0xFF }); _midiFile.AddEvent(message); }
void DecodePartDeclaration(SystemExclusiveEvent declaration) { var id = declaration.Data[2]; ChannelSettings[id].Enabled = (declaration.Data[4] | 0x1) > 0; ChannelSettings[id].reverb = (declaration.Data[4] | 0x2) > 0; ChannelSettings[id].priority = declaration.Data[5]; ChannelSettings[id].volume = Util.ReadPackedByteBe(declaration.Data, 6); ChannelSettings[id].pan = Util.ReadPackedByteBe(declaration.Data, 8); // TODO: flags2 ChannelSettings[id].pitchBend = Util.ReadPackedByteBe(declaration.Data, 11); ChannelSettings[id].program = Util.ReadPackedByteBe(declaration.Data, 13); }
private void DispatchIMuseEvent(SystemExclusiveEvent e) { switch ((IMuseSysExType)e.Data[1]) { case (IMuseSysExType.HookJump): var jump = new Hooks.Jump(e); var enabled = HookJumpsEnabled.TryGetValue(jump.Id, out var persists); if (enabled) { jump.Execute(this); } else { break; } if (!persists) { HookJumpsEnabled.Remove(jump.Id); } break; case IMuseSysExType.SetInstrument: // I think these would normally be translated into bank select commands depending on if the underlying synthesizer supports them. var channel = e.Data[2]; var program = Util.ReadPackedByteBe(e.Data, 3); var bank = channel == MidiHelper.DrumChannel ? (byte)PatchBank.DrumBank : Util.ReadPackedByteBe(e.Data, 5); if (Synthesizer.SoundBank.IsBankLoaded(bank) && !(Synthesizer.SoundBank.GetBank(bank)[program] is null)) { Synthesizer.synthChannels[channel].bankSelect = bank; Synthesizer.synthChannels[channel].program = program; } break; case IMuseSysExType.Marker: if (OnMarkerSequenced is null) { goto default; } OnMarkerSequenced.Invoke(Util.ReadPackedByteBe(e.Data, 2)); break; default: Debug.Log(String.Format("Unhandled iMUSE SysEx {0} at Track:{1} Event:{2}", ((IMuseSysExType)e.Data[1]).ToString(), HeadEventStream.PlayingTrack, HeadEventStream.PlayingEvent)); break; } }
internal static MidiFile JsObjectToMidiFile(dynamic midi) { var midi2 = new MidiFile(); midi2.Division = midi.Division; FastList <dynamic> midiEvents = midi.Events; foreach (var midiEvent in midiEvents) { int tick = midiEvent.Tick; int message = midiEvent.Message; MidiEvent midiEvent2; switch (midiEvent.Type) { case "alphaTab.audio.synth.midi.event.SystemExclusiveEvent": midiEvent2 = new SystemExclusiveEvent(tick, 0, 0, midiEvent.Data); midiEvent2.Message = message; break; case "alphaTab.audio.synth.midi.event.MetaDataEvent": midiEvent2 = new MetaDataEvent(tick, 0, 0, midiEvent.Data); midiEvent2.Message = message; break; case "alphaTab.audio.synth.midi.event.MetaNumberEvent": midiEvent2 = new MetaNumberEvent(tick, 0, 0, midiEvent.Value); midiEvent2.Message = message; break; default: midiEvent2 = new MidiEvent(tick, 0, 0, 0); midiEvent2.Message = message; break; } midi2.Events.Add(midiEvent2); } return(midi2); }
internal static object MidiFileToJsObject(MidiFile midi) { var midi2 = Platform.Platform.NewObject(); midi2.Division = midi.Division; var midiEvents = new FastList <object>(); midi2.Events = midiEvents; foreach (var midiEvent in midi.Events) { var midiEvent2 = Platform.Platform.NewObject(); midiEvents.Add(midiEvent2); midiEvent2.Type = Platform.Platform.GetTypeName(midiEvent); midiEvent2.Tick = midiEvent.Tick; midiEvent2.Message = midiEvent.Message; switch (midiEvent2.Type) { case "alphaTab.audio.synth.midi.event.SystemExclusiveEvent": SystemExclusiveEvent sysex = (SystemExclusiveEvent)midiEvent; midiEvent2.Data = sysex.Data; break; case "alphaTab.audio.synth.midi.event.MetaDataEvent": MetaDataEvent metadata = (MetaDataEvent)midiEvent; midiEvent2.Data = metadata.Data; break; case "alphaTab.audio.synth.midi.event.MetaNumberEvent": MetaNumberEvent metanumber = (MetaNumberEvent)midiEvent; midiEvent2.Value = metanumber.Value; break; } } return(midi2); }
// Working around protected member access limitations here, but ick. internal Hook(SystemExclusiveEvent e) : base(e.DeltaTime, (byte)(e.Channel | e.Command), (short)e.Data1, e.Data) { }