En cours : Passage a 14 bits / feedback

This commit is contained in:
tzim 2015-08-25 21:42:52 +00:00
parent 4494e5420d
commit 3803a830da

View file

@ -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))