Modifs en cours : feedback

This commit is contained in:
tzim 2015-08-25 20:53:03 +00:00
parent 86f98d03fe
commit 4494e5420d

View file

@ -33,6 +33,8 @@ namespace DMX2
readonly uint page;
readonly int midiEvCode;
readonly midiEventSender evsender;
public bool Bound {
get {
return bound;
@ -60,7 +62,7 @@ namespace DMX2
}
}
public internalEvent (string _id, uint _page, int _evHCode)
public internalEvent (string _id, uint _page, int _evHCode, midiEventSender _evsender)
{
internalName = _id;
page = _page;
@ -78,23 +80,36 @@ namespace DMX2
}
}
AlsaSeqLib.snd_seq_event_t storedevent;
public void SendEvent ()
{
if(evsender !=null)
evsender.SendEvent (lastknownvalue);
}
public AlsaSeqLib.snd_seq_event_t StoredEvent {
get {
return storedevent;
}
set {
storedevent = value;
abstract class midiEventSender {
public abstract void SendEvent (int value);
}
class midiCCEvSender : midiEventSender {
public override void SendEvent (int value)
{
}
}
abstract class feedbackinfo : IFeedbackInfo
class midiPBEvSender : midiEventSender {
public override void SendEvent (int value)
{
}
}
class feedbackinfo : IFeedbackInfo
{
MidiEventProvider prov;
readonly internalEvent iev;
protected AlsaSeqLib.snd_seq_event_t ev;
public feedbackinfo (MidiEventProvider _prov, internalEvent _iev)
{
@ -102,26 +117,14 @@ namespace DMX2
iev = _iev;
}
protected abstract bool UpdateEvent (byte data);
#region IFeedbackInfo implementation
bool IFeedbackInfo.FeedBack (byte data)
{
bool update = UpdateEvent (data);
iev.StoredEvent = ev;
iev.LastKnownValue = data;
if (!update)
return true;
if (prov.CurrentPage == iev.Page || iev.Page == 0) {
prov.SendEvent (ev);
foreach (int srcid in prov.feedbacksources) {
prov.lastValueOfSrc [CombineHash (srcid, iev.MidiEvCode)] = data;
}
iev.SendEvent();
}
return true;
@ -129,47 +132,6 @@ namespace DMX2
#endregion
}
class ctrlfeedbackinfo : feedbackinfo
{
public ctrlfeedbackinfo (MidiEventProvider _prov, internalEvent _iev, byte channel, uint param)
:base(_prov,_iev)
{
ev = new AlsaSeqLib.snd_seq_event_t ();
ev.data_ev_ctrl.channel = channel;
ev.data_ev_ctrl.param = param;
ev.type = AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_CONTROLLER;
}
protected override bool UpdateEvent (byte data)
{
int newvalue = (int)data * 127 / 255;
if (newvalue == ev.data_ev_ctrl.value)
return false;
ev.data_ev_ctrl.value = newvalue;
return true;
}
}
class pitchbendfeedbackinfo : feedbackinfo
{
public pitchbendfeedbackinfo (MidiEventProvider _prov, internalEvent _iev, byte channel)
:base(_prov,_iev)
{
ev = new AlsaSeqLib.snd_seq_event_t ();
ev.data_ev_ctrl.channel = channel;
ev.type = AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_PITCHBEND;
}
protected override bool UpdateEvent (byte data)
{
int newvalue = (int)data * 14000 / 255 - 7000;
if (newvalue == ev.data_ev_ctrl.value)
return false;
ev.data_ev_ctrl.value = newvalue;
return true;
}
}
public class MidiDev
{
string name;
@ -438,7 +400,7 @@ namespace DMX2
{
foreach (var ievent in eventlist.Values) {
if (ievent.Page == page) {
SendEvent (ievent.StoredEvent);
ievent.SendEvent();
foreach (int src in feedbacksources) {
int lnvk = CombineHash (src, ievent.MidiEvCode);
if (ievent.LastKnownValue != -1)
@ -467,7 +429,7 @@ namespace DMX2
return false;
uint _page = uint.Parse (res.Groups ["page"].Value);
int _evHC = res.Groups ["id"].Value.GetHashCode ();
eventlist.Add (eventId, new internalEvent (eventId, _page, _evHC));
eventlist.Add (eventId, new internalEvent (eventId, _page, _evHC,null));
}
eventlist [eventId].Bound = true;
@ -631,7 +593,7 @@ namespace DMX2
// Creation de l'objet interne si innexistant
if (!eventlist.ContainsKey (id))
eventlist.Add (id, new internalEvent (id, page, evHC));
eventlist.Add (id, new internalEvent (id, page, evHC,null));
levent = eventlist [id]; //Dernier Evenement recu conserve pour menu
if (!lastValueOfSrc.ContainsKey (lnvk))
@ -651,8 +613,6 @@ namespace DMX2
}
lastValueOfSrc [lnvk] = (byte)value;
eventlist [id].StoredEvent = evS;
eventlist [id].LastKnownValue = (byte)value;
}
@ -708,7 +668,9 @@ namespace DMX2
if (!eventlist.ContainsKey (eventId))
return null;
var res = regexCtrlEventID.Match (eventId);
return new feedbackinfo (this, eventlist [eventId]);
/*var res = regexCtrlEventID.Match (eventId);
if (res.Success) {
byte chan = byte.Parse (res.Groups ["chan"].Value);
uint param = uint.Parse (res.Groups ["param"].Value);
@ -719,7 +681,7 @@ namespace DMX2
byte chan = byte.Parse (res.Groups ["chan"].Value);
return new pitchbendfeedbackinfo (this, eventlist [eventId], chan);
}
return null;
return null;*/
}