/// <summary>
 /// Triggers a javascript event on this implant.  Events not
 /// in range will be simply ignored.
 /// </summary>
 public void Trigger(ImplantEvent e)
 {
     if (ImplantInstance != null)
     {
         ImplantInstance.Trigger(e);
     }
 }
Exemple #2
0
        /// <summary>
        /// Called only by the kernel
        /// </summary>
        internal void TriggerFromKernel(ImplantEvent e)
        {
            MappedMidiDevice device = e.Hardware;

            // allow event interception
            if (ImplantEventTriggered != null)
            {
                ImplantEventTriggered(this, e);
            }

            // OSC events are special.  they are delievered to all
            // implants except their source
            // TODO: likely need an OSC registration system so only
            // implants that have registered for a specific OSC address
            // will get the message
            if (e is OscImplantEvent)
            {
                var osc = e as OscImplantEvent;
                if (osc.Osc != null)
                {
                    foreach (var implant in Items.ToArray())
                    {
                        if (implant.Active && implant.Running)
                        {
                            if (implant.GetSourceName() != osc.Osc.Source)
                            {
                                implant.Trigger(e);
                            }
                        }
                    }
                }
                return;
            }



            // determine which implants are to receive the event
            if (device == null || SendToAllEvents(e))
            {
                // send these events to all implants untranslated
                // TODO: how do we deal with visible here?
                foreach (var implant in Items.ToArray())
                {
                    if (implant.Active && implant.Running)
                    {
                        implant.Trigger(e);
                    }
                }
            }
            else
            {
                // send translated event to each implant.
                var targets = GetImplantsByPhysicalAddress(device, e, true);
                foreach (var implant in targets.Keys)
                {
                    implant.Trigger(targets[implant]);
                }
            }
        }
Exemple #3
0
 /// <summary>
 /// Sends implant event to EventReceived.
 /// </summary>
 public void Trigger(ImplantEvent ie)
 {
     if (ie != null)
     {
         ie.Hardware = this.Mapping;
         ie.ScheduleTask();
     }
 }
Exemple #4
0
        /// <summary>
        /// Called by MidiInput to translate a midi message to an
        /// implant event to trigger.  Exposed here to allow simulated
        /// devices to insert data into the event chain.
        /// </summary>
        public void Trigger(MidiMessage m)
        {
            ImplantEvent e = Convert(m);

            if (e != null)
            {
                e.CausedBy = m;
                Trigger(e);
            }
        }
Exemple #5
0
 /// <summary>
 /// Returns true if a given event is one that should go to
 /// all implants.
 /// </summary>
 private bool SendToAllEvents(ImplantEvent e)
 {
     if (e is PadImplantEvent)
     {
         return(false);
     }
     if (e is KnobImplantEvent)
     {
         return(false);
     }
     return(true);
 }
        /// <summary>
        /// Converts a raw MIDI message into an event ready to be
        /// sent to an implant.
        /// </summary>
        public override ImplantEvent Convert(MidiMessage midi)
        {
            // convert to XY
            int x;
            int y;
            ImplantEventType type;

            XYMapper.ConvertXY(midi.Type, midi.Pitch, out x, out y, out type);

            if (type == ImplantEventType.PadPress)
            {
                if (midi.Value == 0)
                {
                    type = ImplantEventType.PadRelease;
                }
                else if (IsDoublePress(midi))
                {
                    type = ImplantEventType.PadDoubleClick;
                }
            }

            // create event
            ImplantEvent ret = null;

            switch (type)
            {
            case ImplantEventType.KnobChange:
                ret = new KnobChangeImplantEvent();
                break;

            case ImplantEventType.PadPress:
                ret = new PadPressImplantEvent();
                break;

            case ImplantEventType.PadRelease:
                ret = new PadReleaseImplantEvent();
                break;

            case ImplantEventType.PadDoubleClick:
                ret = new PadDoubleClickImplantEvent();
                break;
            }

            // set standard values
            if (ret != null)
            {
                ret.X     = x;
                ret.Y     = y;
                ret.Value = midi.Value;
            }
            return(ret);
        }
Exemple #7
0
        /// <summary>
        /// Passes on an event to the appropriate javascript methods.
        /// Out of range events will be simply ignored.
        /// </summary>
        public void Trigger(ImplantEvent e)
        {
            var jsEvent = e.Convert();

            // if this event type has a target, trigger the event and record the destination
            ImplantEventBaseJSInstance target = GetEventTarget(e);

            if (target != null)
            {
                target.Trigger(jsEvent);
                e.LogDestination(Parent.GetSourceName());
            }
        }
Exemple #8
0
 /// <summary>
 /// Gets the event name for javascript from an implant event instance.
 /// </summary>
 internal static string GetJSEventName(ImplantEvent e)
 {
     if (e is Clock96ImplantEvent)
     {
         return("1/96");
     }
     if (e is KnobChangeImplantEvent)
     {
         return("change");
     }
     if (e is PadPressImplantEvent)
     {
         return("press");
     }
     if (e is PadReleaseImplantEvent)
     {
         return("release");
     }
     if (e is PadDoubleClickImplantEvent)
     {
         return("doublepress");
     }
     if (e is DeviceChangeImplantEvent)
     {
         return("devicechange");
     }
     if (e is ModeChangeImplantEvent)
     {
         return("modechanged");
     }
     if (e is GuiPaintImplantEvent)
     {
         return("paint");
     }
     if (e is NoteOnImplantEvent)
     {
         return("noteon");
     }
     if (e is NoteOffImplantEvent)
     {
         return("noteoff");
     }
     if (e is OscImplantEvent)
     {
         return("change");
     }
     return("unknown");
 }
Exemple #9
0
        /// <summary>
        /// Creates a note implant event from a midi message.
        /// </summary>
        public override ImplantEvent Convert(MidiMessage midi)
        {
            ImplantEvent ret = null;

            switch (midi.Type)
            {
            case MidiMessageType.NoteOn:
                ret = new NoteOnImplantEvent();
                break;

            case MidiMessageType.NoteOff:
                ret = new NoteOffImplantEvent();
                break;
            }
            if (ret != null)
            {
                ret.X     = midi.Pitch;
                ret.Value = midi.Velocity;
            }
            return(ret);
        }
Exemple #10
0
        /// <summary>
        /// Returns the instance of the object that should receive
        /// a particular event, or null if none should.
        /// </summary>
        private ImplantEventBaseJSInstance GetEventTarget(ImplantEvent e)
        {
            if (e is Clock96ImplantEvent)
            {
                return(time);
            }
            else if (e is NoteImplantEvent)
            {
                return(keys);
            }
            else if (e is PadImplantEvent)
            {
                return(pads);
            }
            else if (e is KnobImplantEvent)
            {
                return(knobs);
            }
            else if (e is OscImplantEvent)
            {
                return(osc);
            }
            else if (e is GuiImplantEvent)
            {
                return(gui);
            }
            else if (e is ModeChangeImplantEvent)
            {
                return(mode);
            }
            else if (e is DeviceChangeImplantEvent)
            {
                return(this);
            }

            /*
             * switch (e.EventType)
             * {
             *  case ImplantEventType.GuiPaint:
             *      return gui;
             *  case ImplantEventType.NoteOn:
             *  case ImplantEventType.NoteOff:
             *      return keys;
             *  case ImplantEventType.KnobChange:
             *      return knobs;
             *  case ImplantEventType.PadPress:
             *  case ImplantEventType.PadRelease:
             *  case ImplantEventType.PadDoubleClick:
             *      return pads;
             *  case ImplantEventType.DeviceChange:
             *      return this;
             *  case ImplantEventType.ModeChange:
             *      return mode;
             *  case ImplantEventType.Clock96:
             *      return time;
             *  case ImplantEventType.OscMessage:
             *      return osc;
             * }
             */
            return(null);
        }
Exemple #11
0
        /// <summary>
        /// Returns the list of all Implants that are mapped to a given
        /// device coordinate so we never waste time sending events
        /// to implants that won't use them.
        /// </summary>
        private Dictionary <JavascriptImplant, ImplantEvent> GetImplantsByPhysicalAddress(MappedMidiDevice device, ImplantEvent e, bool visibleOnly = false)
        {
            // TODO: need to decide how to deal with modes here
            var target = visibleOnly ? Visible.ToArray() : Items.ToArray();

            var ret = new Dictionary <JavascriptImplant, ImplantEvent>();

            foreach (var implant in target)
            {
                if (implant.Active == false)
                {
                    continue;
                }
                if (implant.Running == false)
                {
                    continue;
                }

                int vx, vy;
                if (implant.ActiveArea.GetVirtualAddress(device, e.X, e.Y, out vx, out vy))
                {
                    // TODO: scroll these?!!!

                    // clone this event with a virtual address for this implant
                    var implantEvent = e.Clone();
                    implantEvent.X = vx;
                    implantEvent.Y = vy;
                    ret.Add(implant, implantEvent);
                }
            }
            return(ret);
        }