// This is our response to when a track had been loaded // // public override void AfterTrackLoaded(object sender, EventArgs e) { base.AfterTrackLoaded(sender, e); // clear note-list this.listNotes.Items.Clear(); // notes have been collected by the midi parser, // filter them. foreach (MidiNote n in UserInterface.MidiParser.Notes) { timing.SolveSamples( Convert.ToDouble(n.Start), samplerate, this.UserInterface.MidiParser.MidiTimeInfo.Tempo, MidiReader.FileDivision, true); if (!(n is MidiNote)) { continue; } // s, n, o, l, off listNotes.AddItem( // Paint ListView.DefaultBackColor, // MBQT n.GetMBT(MidiReader.FileDivision), // SAMPLE TIME timing.TimeString, // MIDI CHANNEL n.Ch.HasValue ? n.Ch.ToString() : "?", // NOTE KEY n.KeyStr, // NOTE ON VELOCITY n.V1.ToString(), // NOTE LENGTH n.GetMbtLen2(MidiReader.FileDivision), // NOTE OFF VELOCITY n.V2.ToString() ); } this.listNotes.Visible = true; }
/// we should have prepared a list of notes and each channel contained in /// our view. void UpdateView() { foreach (MidiMessage n in SetOfNotes) { timing.SolveSamples(Convert.ToDouble(n.DeltaTime), Player.Settings); if (!(n is MidiMessage)) { continue; } // s, n, o, l, off // listNotes.AddItem( // ListView.DefaultBackColor, // n.GetMBT(MidiReader.FileDivision), // timing.TimeString, // n.Ch.HasValue ? n.Ch.ToString() : "?", // n.KeyStr, // n.V1.ToString(), // n.GetMbtLen(MidiReader.FileDivision), // n.V2.ToString() // ); } }
void GotMidiEventD(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) { timing.SolveSamples( ppq, UserInterface.VstContainer.VstPlayer.Settings.Rate, UserInterface.MidiParser.MidiTimeInfo.Tempo, UserInterface.MidiParser.SmfFileHandle.Division, true ); switch (t) { case MidiMsgType.MetaStr: lve.AddItem(MidiReader.c4, UserInterface.MidiParser.GetMbtString(ppq), string.Empty, string.Empty, MetaHelpers.MetaNameFF(imsg), UserInterface.MidiParser.GetMetaString(offset)); break; case MidiMsgType.MetaInf: lve.AddItem(UserInterface.MidiParser.GetEventColor(imsg, MidiReader.cR), UserInterface.MidiParser.GetMbtString(ppq), string.Empty, string.Empty, MetaHelpers.MetaNameFF(imsg), UserInterface.MidiParser.GetMetaSTR(offset)); break; case MidiMsgType.SysCommon: case MidiMsgType.System: lve.AddItem(UserInterface.MidiParser.GetEventColor(imsg, MidiReader.cR), UserInterface.MidiParser.GetMbtString(ppq), string.Empty, string.Empty, MetaHelpers.MetaNameFF(imsg), UserInterface.MidiParser.GetMetaSTR(offset)); break; default: // case MsgType.Channel: if (isrse) { lve.AddItem(UserInterface.MidiParser.GetRseEventColor(UserInterface.MidiParser.Colors["225"]), UserInterface.MidiParser.GetMbtString(ppq), timing.TimeString, bmsg == 0xF0?"":(rse & 0x0F).ToString(), UserInterface.MidiParser.GetRseEventString(offset), UserInterface.MidiParser.chRseV(offset)); } else { lve.AddItem(UserInterface.MidiParser.GetEventColor(UserInterface.MidiParser.Colors["225"]), UserInterface.MidiParser.GetMbtString(ppq), timing.TimeString, bmsg == 0xF0?"":(rse & 0x0F).ToString(), UserInterface.MidiParser.GetEventString(offset), UserInterface.MidiParser.chV(offset)); } // if (t== MsgType.NoteOn||t== MsgType.NoteOff) UserInterface.MidiParser.CheckNote(t,ppq,Convert.ToByte((rse) & 0x0F),offset,bmsg,isrse); break; } }
static bool IsContained(MidiMessage message, Loop constraint, SampleClock clockRef, double min, double max) { double samplePos = clockRef.SolveSamples(message.DeltaTime).Samples32; return(samplePos >= min && samplePos < max && samplePos < constraint.End); }
/// <summary> /// Check sample-range /// </summary> /// <param name="c">must have Division and PPQ set.</param> /// <param name="b">We currently check the end position of the loop.</param> /// <returns>True if delta-time is contained within sample ranges min and max</returns> public bool IsContained(SampleClock c, Loop b) { double samplePos = c.SolveSamples(DeltaTime).Samples32; return(samplePos >= b.Begin && samplePos < b.End); }
/// <summary> /// Check sample-range /// </summary> /// <param name="c">must have Division and PPQ set.</param> /// <param name="b">We currently check the end position of the loop.</param> /// <param name="min">first sample in search block</param> /// <param name="max">last sample in search block</param> /// <returns>True if delta-time is contained within sample ranges min and max</returns> public bool IsContained(SampleClock c, Loop b, double min, double max) { double samplePos = c.SolveSamples(DeltaTime).Samples32; return(samplePos >= min && samplePos < max && samplePos < b.End); }
static public Jacobi.Vst.Core.VstMidiSysExEvent ToVstMidiSysex(this MidiMessage item, int offset, ITimeConfiguration config, SampleClock c) { int samples = c.SolveSamples(item.DeltaTime).Samples32Floor - offset; return(new Jacobi.Vst.Core.VstMidiSysExEvent(samples, (item as MidiSysexMessage).SystemData)); }
/// <summary> /// Check sample-range /// </summary> /// <param name="c">must have Division and PPQ set.</param> /// <param name="b">We currently check the end position of the loop.</param> /// <returns>True if delta-time is contained within sample ranges min and max</returns> public bool IsContained(SampleClock c, Loop b) { double samplePos = c.SolveSamples(DeltaTime).Samples32; return samplePos >= b.Begin && samplePos < b.End; }
/// <summary> /// Check sample-range /// </summary> /// <param name="c">must have Division and PPQ set.</param> /// <param name="b">We currently check the end position of the loop.</param> /// <param name="min">first sample in search block</param> /// <param name="max">last sample in search block</param> /// <returns>True if delta-time is contained within sample ranges min and max</returns> public bool IsContained(SampleClock c, Loop b, double min, double max) { double samplePos = c.SolveSamples(DeltaTime).Samples32; return samplePos >= min && samplePos < max && samplePos < b.End; }
public static Jacobi.Vst.Core.VstMidiSysExEvent ToVstMidiSysex(this MidiMessage item, int offset, ITimeConfiguration config, SampleClock c) { int samples = c.SolveSamples(item.DeltaTime).Samples32Floor-offset; return new Jacobi.Vst.Core.VstMidiSysExEvent(samples,(item as MidiSysexMessage).SystemData); }
public static Jacobi.Vst.Core.VstMidiEvent ToVstMidiEvent(this MidiMessage item, int offset, ITimeConfiguration config, SampleClock c) { // byte b0 = (config.IsSingleZeroChannel) ? (byte)item.MessageBit : item.Data[0]; int samples = c.SolveSamples(item.DeltaTime).Samples32Floor - offset; return new Jacobi.Vst.Core.VstMidiEvent(samples, 0, 0, new byte[4]{ item.Data[0], item.Data[1], item.Data[2], 0 }, 0 , 0 ); }
/// <inheritdoc /> public Jacobi.Vst.Core.VstTimeInfo GetTimeInfo(Jacobi.Vst.Core.VstTimeInfoFlags filterFlags) { RaisePluginCalled("GetTimeInfo(" + filterFlags + ")"); // our sample calculator performs: // Create TimeInfo class VstTimeInfo vstTimeInfo = new VstTimeInfo(); // most common settings vstTimeInfo.SamplePosition = Parent.SampleOffset + Parent.BufferIncrement; vstTimeInfo.SampleRate = Parent.Settings.Rate; // filterFlags |= VstTimeInfoFlags.ClockValid; if (filterFlags.HasFlag(VstTimeInfoFlags.ClockValid)) { // should we floor this? int cp = MasterClock.SolvePPQ(Parent.SampleOffset, Parent.Settings).ClocksAtPosition.ToInt32(); vstTimeInfo.SamplesToNearestClock = MasterClock.SolveSamples(cp * 24, Parent.Settings).Samples32Floor; } // NanoSecondsValid filterFlags |= VstTimeInfoFlags.NanoSecondsValid; if (filterFlags.HasFlag(VstTimeInfoFlags.NanoSecondsValid)) { vstTimeInfo.NanoSeconds = (Parent.SampleOffset / Parent.Settings.Rate) * billionth; } // TempoValid filterFlags |= VstTimeInfoFlags.TempoValid; if (filterFlags.HasFlag(VstTimeInfoFlags.TempoValid)) { vstTimeInfo.Tempo = Parent.Settings.Tempo; } // PpqPositionValid filterFlags |= VstTimeInfoFlags.PpqPositionValid; if (filterFlags.HasFlag(VstTimeInfoFlags.PpqPositionValid)) { vstTimeInfo.PpqPosition = MasterClock.SolvePPQ(vstTimeInfo.SamplePosition, Parent.Settings).Frame; } // BarStartPositionValid filterFlags |= VstTimeInfoFlags.BarStartPositionValid; if (filterFlags.HasFlag(VstTimeInfoFlags.BarStartPositionValid)) { vstTimeInfo.BarStartPosition = MasterClock.SolvePPQ(vstTimeInfo.SamplePosition, Parent.Settings).Pulses; // * st.SamplesPerQuarter } // CyclePositionValid filterFlags |= VstTimeInfoFlags.CyclePositionValid; if (filterFlags.HasFlag(VstTimeInfoFlags.CyclePositionValid)) { vstTimeInfo.CycleStartPosition = Parent.SampleOffset;//st.SolvePPQ(Parent.SampleOffset,Parent.Settings).Frame; vstTimeInfo.CycleEndPosition = Parent.SampleOffset + Parent.CurrentSampleLength; } // TimeSignatureValid if (filterFlags.HasFlag(VstTimeInfoFlags.TimeSignatureValid)) { vstTimeInfo.TimeSignatureNumerator = Parent.Settings.TimeSignature.Numerator; vstTimeInfo.TimeSignatureDenominator = Parent.Settings.TimeSignature.Denominator; } // SmpteValid if (filterFlags.HasFlag(VstTimeInfoFlags.SmpteValid)) { vstTimeInfo.SmpteFrameRate = smpte_rate; /* 30 fps no-drop */ vstTimeInfo.SmpteOffset = 0; /* not quite valid */ } vstTimeInfo.Flags = filterFlags; return(vstTimeInfo); }