diff --git a/DMX-2.0/MidiEventProvider.cs b/DMX-2.0/MidiEventProvider.cs index cf807ad..52e2e70 100644 --- a/DMX-2.0/MidiEventProvider.cs +++ b/DMX-2.0/MidiEventProvider.cs @@ -67,6 +67,7 @@ namespace DMX2 internalName = _id; page = _page; midiEvCode = _evHCode; + evsender = _evsender; } int lastknownvalue = -1; @@ -93,8 +94,31 @@ namespace DMX2 } class midiCCEvSender : midiEventSender { + readonly MidiEventProvider prov; + + AlsaSeqLib.snd_seq_event_t ev; + AlsaSeqLib.snd_seq_event_t ev2; + + public midiCCEvSender (MidiEventProvider _prov, byte _chan, uint _param){ + prov = _prov; + ev = new AlsaSeqLib.snd_seq_event_t(); + ev.type = AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_CONTROLLER; + ev.data_ev_ctrl.channel = _chan; + ev.data_ev_ctrl.param = _param; + ev2 = ev; + ev2.data_ev_ctrl.param -= 32; + } public override void SendEvent (int value) { + if (prov.Fourteenbits && ev2.data_ev_ctrl.param <32 ) { + ev2.data_ev_ctrl.value = value >> 7; + ev.data_ev_ctrl.value = value & 0xFF; + prov.SendEvent (ev2); + prov.SendEvent (ev); + } else { + ev.data_ev_ctrl.value = value * 127 / 255; + prov.SendEvent (ev); + } } } @@ -125,6 +149,11 @@ namespace DMX2 if (prov.CurrentPage == iev.Page || iev.Page == 0) { iev.SendEvent(); + foreach (int src in prov.feedbacksources) { + int lnvk = CombineHash (src, iev.MidiEvCode); + if (iev.LastKnownValue != -1) + prov.lastValueOfSrc [lnvk] = (byte)iev.LastKnownValue; + } } return true; @@ -525,7 +554,7 @@ namespace DMX2 } id = string.Format ("CTRL-C{0}P{1}", evS.data_ev_ctrl.channel, evS.data_ev_ctrl.param-32); msbAddr = evS.data_ev_ctrl.channel * 32 + evS.data_ev_ctrl.param - 32; - value = ((fbTmpData [msbAddr] << 7) ^ evS.data_ev_ctrl.value) >> 6; + value = ((fbTmpData [msbAddr] << 7) ^ evS.data_ev_ctrl.value); } else { id = string.Format ("CTRL-C{0}P{1}", evS.data_ev_ctrl.channel, evS.data_ev_ctrl.param); value = 255 * evS.data_ev_ctrl.value / 127; // Conversion {0,127} => {0,255} @@ -592,8 +621,18 @@ namespace DMX2 id = string.Format ("MIDI-PAGE{0}-{1}", evpage, id); // Creation de l'objet interne si innexistant - if (!eventlist.ContainsKey (id)) - eventlist.Add (id, new internalEvent (id, page, evHC,null)); + if (!eventlist.ContainsKey (id)) { + switch (evS.type) { + case AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_CONTROLLER: + eventlist.Add (id, new internalEvent (id, page, evHC, + new midiCCEvSender(this,channel,evS.data_ev_ctrl.param)) + ); + break; + default: + eventlist.Add (id, new internalEvent (id, page, evHC, null)); + break; + } + } levent = eventlist [id]; //Dernier Evenement recu conserve pour menu if (!lastValueOfSrc.ContainsKey (lnvk))