Feedback Midi fonctionnel

This commit is contained in:
tzim 2014-05-15 13:51:04 +00:00
parent 21023ce2fa
commit 86bb4c46a0
4 changed files with 101 additions and 5 deletions

View file

@ -20,6 +20,7 @@
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause> <ConsolePause>false</ConsolePause>
<Commandlineparameters>aguibtn</Commandlineparameters>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<DebugType>none</DebugType> <DebugType>none</DebugType>

View file

@ -209,6 +209,8 @@ namespace DMX2
public int result; public int result;
} }
const int sizeof_snd_seq_event_t = 24;
[StructLayout(LayoutKind.Explicit)] [StructLayout(LayoutKind.Explicit)]
struct snd_seq_event_t { struct snd_seq_event_t {
[FieldOffset(0)] [FieldOffset(0)]
@ -255,6 +257,12 @@ namespace DMX2
[DllImport(ASOUND_LIB_NAME, CallingConvention = CallingConvention.Cdecl)] [DllImport(ASOUND_LIB_NAME, CallingConvention = CallingConvention.Cdecl)]
static extern int snd_seq_free_event(IntPtr ev); static extern int snd_seq_free_event(IntPtr ev);
[DllImport(ASOUND_LIB_NAME, CallingConvention = CallingConvention.Cdecl)]
static extern int snd_seq_event_output (IntPtr seq, IntPtr ev);
[DllImport(ASOUND_LIB_NAME, CallingConvention = CallingConvention.Cdecl)]
static extern int snd_seq_drain_output (IntPtr seq);
} }
} }

View file

@ -40,12 +40,28 @@ namespace DMX2
} }
} }
int inport;
int outport;
public static int InPort {
get {
return singleton.inport;
}
}
public static int OutPort {
get {
return singleton.outport;
}
}
MidiSeqHandle(){ MidiSeqHandle(){
snd_seq_open(out midi_seq_handle, "default",SND_SEQ_OPEN_DUPLEX,0); snd_seq_open(out midi_seq_handle, "default",SND_SEQ_OPEN_DUPLEX,0);
snd_seq_set_client_name(midi_seq_handle,"DMX2"); snd_seq_set_client_name(midi_seq_handle,"DMX2");
snd_seq_create_simple_port(midi_seq_handle,"dmx_ctrl", inport= snd_seq_create_simple_port(midi_seq_handle,"dmx_ctrl_in",
SND_SEQ_PORT_CAP_WRITE + SND_SEQ_PORT_CAP_SUBS_WRITE, SND_SEQ_PORT_CAP_WRITE + SND_SEQ_PORT_CAP_SUBS_WRITE,
SND_SEQ_PORT_TYPE_APPLICATION); SND_SEQ_PORT_TYPE_APPLICATION);
outport= snd_seq_create_simple_port(midi_seq_handle,"dmx_ctrl_out",
SND_SEQ_PORT_CAP_READ + SND_SEQ_PORT_CAP_SUBS_READ,
SND_SEQ_PORT_TYPE_APPLICATION);
} }
#region IDisposable implementation #region IDisposable implementation
@ -72,17 +88,76 @@ namespace DMX2
} }
} }
class midiFeedbackInfo : IFeedbackInfo {
class feedbackinfo : IFeedbackInfo {
MidiEventProvider prov;
snd_seq_event_t ev;
public feedbackinfo(MidiEventProvider _prov, byte channel,uint param){
ev = new snd_seq_event_t(); prov=_prov;
ev.data_ev_ctrl.channel = channel;
ev.data_ev_ctrl.param= param;
ev.type = snd_seq_event_type_t.SND_SEQ_EVENT_CONTROLLER;
}
#region IFeedbackInfo implementation #region IFeedbackInfo implementation
bool IFeedbackInfo.FeedBack (byte data) bool IFeedbackInfo.FeedBack (byte data)
{ {
throw new System.NotImplementedException (); ev.data_ev_ctrl.value = (byte)((int)data * 127 / 255) ;
prov.SendEvent(ev);
return true;
} }
#endregion #endregion
} }
Dictionary<string,internalEvent> eventlist = new Dictionary<string, internalEvent>(); public class PointerWrapper : IDisposable
{
public IntPtr Pointer { get; private set; }
public PointerWrapper (int pointerSize)
{
Pointer = Marshal.AllocHGlobal (pointerSize);
}
public PointerWrapper (IntPtr ptr)
{
Pointer = ptr;
}
~PointerWrapper ()
{
Dispose (false);
}
public void Dispose ()
{
Dispose (true);
GC.SuppressFinalize (this);
}
protected virtual void Dispose (bool disposing)
{
if (Pointer != IntPtr.Zero) {
Marshal.FreeHGlobal (Pointer);
}
}
}
PointerWrapper evPtr = new PointerWrapper(32);
void SendEvent (snd_seq_event_t ev)
{
ev.queue = 253;
ev.source.port = (byte) MidiSeqHandle.OutPort;
ev.dest.client=254;
ev.dest.port= 0;
Marshal.StructureToPtr(ev,evPtr.Pointer,false);
snd_seq_event_output(MidiSeqHandle.Handle,evPtr.Pointer);
snd_seq_drain_output(MidiSeqHandle.Handle);
}
Dictionary<string,internalEvent> eventlist = new Dictionary<string, internalEvent>();
EventData last; EventData last;
internalEvent levent=null; internalEvent levent=null;
bool connected=false; bool connected=false;
@ -212,9 +287,21 @@ namespace DMX2
} }
} }
static System.Text.RegularExpressions.Regex regexCtrlEventID = new System.Text.RegularExpressions.Regex(
@"MIDI-CTRL-C(?<chan>\d+)P(?<param>\d+)",
System.Text.RegularExpressions.RegexOptions.Compiled);
IFeedbackInfo IEventProvider.GetFeedbackInfo (string eventId) IFeedbackInfo IEventProvider.GetFeedbackInfo (string eventId)
{ {
var res = regexCtrlEventID.Match (eventId);
if (res.Success) {
Console.WriteLine("Succes");
byte chan = byte.Parse (res.Groups ["chan"].Value);
uint param = uint.Parse (res.Groups ["param"].Value);
return new feedbackinfo (this, chan, param);
}
return null; return null;
} }
#endregion #endregion

View file

@ -173,7 +173,7 @@ namespace DMX2
List<IFeedbackInfo> feedbacks = new List<IFeedbackInfo>(); List<IFeedbackInfo> feedbacks = new List<IFeedbackInfo>();
bool IEventTarget.CanFeedback { get { return false; } } bool IEventTarget.CanFeedback { get { return true; } }
void IEventTarget.AddFeedback (IFeedbackInfo info) void IEventTarget.AddFeedback (IFeedbackInfo info)
{ {