/// <summary> /// Maps to a MIDI message if it can, or returns null. /// </summary> /// <param name="osc">The OSC message to map</param> /// <param name="mapping">The mapping used to generate this packet.</param> public MidiMessage Map(OscDataMessage osc, out OscToMidiMap mapping) { // find a mapping that can convert this osc mapping = FindMapping(osc.Address, osc.Source); if (mapping == null) { return(null); } // build midi var ret = new MidiMessage(); ret.Type = mapping.MidiType; ret.Pitch = mapping.GetMidiNote(osc.Address); ret.Value = mapping.GetMidiValue(osc.Value); return(ret); }
/// <summary> /// Overwrites the current session settings from a parsed /// JSON object. /// </summary> private static void Deserialize(UserSession session, SessionFileFormat file) { // devices must loaded first for implant loaded to work session.Devices.ClearAll(); foreach (var item in file.devices) { try { session.Devices.MapByName(item.deviceName, item.mappedAs); var mapping = session.Devices.GetMappedDeviceByName(item.deviceName); mapping.Enabled = item.enabled; } catch (Exception ex) { LPConsole.WriteLine("SessionFile", ex.Message); } } session.Devices.AutoMap(); // load the implants session.Implants.ClearAll(); foreach (var item in file.implants) { RangeMap range; if (item.activeArea == null) { range = new RangeMap(MIDI.MappedMidiDevice.CreateNullDevice()); } else { range = item.activeArea.ToRangeMap(); } if (item.status != "not loaded") { var implant = session.Implants.Load(item.vpath, range, item.oscFormat); // important to load session values first so the init doesn't screw it up if (item.doubleValues != null) { implant.ImplantInstance.session.DoubleValues.Clear(); foreach (var key in item.doubleValues.Keys) { implant.ImplantInstance.session.DoubleValues.Add(key, item.doubleValues[key]); } } if (item.stringValues != null) { implant.ImplantInstance.session.StringValues.Clear(); foreach (var key in item.stringValues.Keys) { implant.ImplantInstance.session.StringValues.Add(key, item.stringValues[key]); } } implant.AssignedMode = item.assignedMode; if (item.status == "running") { implant.ServerInit(); } } } session.MidiMap.Mappings.Clear(); foreach (var item in file.midiMap) { var m = new OscToMidiMap(); m.ID = item.id; m.OscSource = item.oscSource; m.OscAddress = item.oscAddress; m.OscValueFrom = item.oscValueFrom; m.OscValueTo = item.oscValueTo; m.MidiDestination = item.midiDestination; m.MidiType = item.midiType.GetMidiMessageType(); //OscToMidiMap.FromString(item.midiType); m.MidiNote = item.midiNote; m.MidiValueFrom = item.midiValueFrom; m.MidiValueTo = item.midiValueTo; session.MidiMap.Mappings.Add(m); } }
/// <summary> /// Handler for ajax requests to /settings/midimap /// </summary> /// <param name="ctx"></param> public static void Process(LPWebContext ctx) { try { string cmd = ctx.Request["cmd"] ?? "load"; switch (cmd.ToLower()) { case "outputdevices": // list of MIDI devices we could output to { var list = new List <string>(); list.Add("All Midi"); foreach (var d in UserSession.Current.Devices[typeof(MidiOutputHardwareInterface)]) //[MidiDeviceMapping.MidiOutput]) { list.Add(d.Device.Name); } ctx.Response.Write(JsonConvert.SerializeObject(list)); } break; case "implants": // list of implants we could use as a source { var list = new List <string>(); list.Add("Any Implant"); foreach (var i in UserSession.Current.Implants.Running) { list.Add(i.GetSourceName()); } ctx.Response.Write(JsonConvert.SerializeObject(list)); } break; case "save": { var item = UserSession.Current.MidiMap.GetById(ctx.Request["id"]); // must be a new item if not found if (item == null) { item = new OscToMidiMap(); item.ID = ctx.Request["id"]; item.OscAddress = ctx.Request["oscAddress"]; item.OscValueFrom = double.Parse(ctx.Request["oscValueFrom"]); item.OscValueTo = double.Parse(ctx.Request["oscValueTo"]); item.OscSource = ctx.Request["oscSource"]; item.MidiType = ctx.Request["midiType"].GetMidiMessageType(); //OscToMidiMap.FromString(ctx.Request["midiType"]); item.MidiNote = ctx.Request["midiNote"]; item.MidiValueFrom = int.Parse(ctx.Request["midiValueFrom"]); item.MidiValueTo = int.Parse(ctx.Request["midiValueTo"]); item.MidiDestination = ctx.Request["midiDestination"]; if (item.OscSource.ToLower() == "any implant") { item.OscSource = null; } if (item.MidiDestination.ToLower() == "all midi") { item.MidiDestination = null; } UserSession.Current.MidiMap.Mappings.Add(item); } else { item.OscAddress = ctx.Request["oscAddress"]; item.OscValueFrom = double.Parse(ctx.Request["oscValueFrom"]); item.OscValueTo = double.Parse(ctx.Request["oscValueTo"]); item.OscSource = ctx.Request["oscSource"]; item.MidiType = ctx.Request["midiType"].GetMidiMessageType(); item.MidiNote = ctx.Request["midiNote"]; item.MidiValueFrom = int.Parse(ctx.Request["midiValueFrom"]); item.MidiValueTo = int.Parse(ctx.Request["midiValueTo"]); item.MidiDestination = ctx.Request["midiDestination"]; if (item.OscSource.ToLower() == "any implant") { item.OscSource = null; } if (item.MidiDestination.ToLower() == "all midi") { item.MidiDestination = null; } } ctx.Response.Write("Saving ID #" + ctx.Request["id"]); UserSession.Current.Save(); } break; case "remove": { UserSession.Current.MidiMap.DeleteById(ctx.Request["id"]); UserSession.Current.Save(); ctx.Response.Write("Deleting ID #" + ctx.Request["id"]); } break; default: { // just return the list for all current device mappings var list = new List <MappingItemJson>(); foreach (var mapping in UserSession.Current.MidiMap.Mappings) { var item = new MappingItemJson(); item.id = mapping.ID; item.oscSource = mapping.OscSource ?? "Any Implant"; item.oscAddress = mapping.OscAddress; item.oscValueFrom = mapping.OscValueFrom; item.oscValueTo = mapping.OscValueTo; item.midiDestination = mapping.MidiDestination ?? "All Midi"; item.midiType = mapping.MidiType.GetString(); item.midiNote = mapping.MidiNote; item.midiValueFrom = mapping.MidiValueFrom; item.midiValueTo = mapping.MidiValueTo; list.Add(item); } ctx.Response.Write(JsonConvert.SerializeObject(list)); } break; } } catch (Exception ex) { ctx.Response.Send500(ex.ToString()); } }