Esempio n. 1
0
 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);
 }
Esempio n. 2
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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;
            }
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
 // 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)
 {
 }