Ejemplo n.º 1
0
        public void Apply(Region region)
        {
            // Just transposes, all we had time to implement
            KeySignature harmonyKey        = _harmony.MetaState.KeySignature;
            KeySignature melodyKey         = region.State.KeySignature;
            int          harmonyMajorTonic = harmonyKey.Scale == Scale.MAJOR
                ? (int)harmonyKey.Tonic : (int)harmonyKey.Tonic + 3;
            int melodyMajorTonic = harmonyKey.Scale == Scale.MAJOR
                ? (int)melodyKey.Tonic : (int)melodyKey.Tonic + 3;

            int interval = (harmonyMajorTonic - melodyMajorTonic) % 12;

            region.State.KeySignature = harmonyKey;

            foreach (TimedNote note in region)
            {
                note.Pitch += (byte)interval;
            }
        }
Ejemplo n.º 2
0
        private static void RunOpenWallet(string fileName)
        {
            if (!File.Exists(fileName))
            {
                Console.WriteLine("Could not find wallet file: " + fileName);
                return;
            }
            var jsonConfig = File.ReadAllText(fileName);
            var walletFile = Newtonsoft.Json.JsonConvert.DeserializeObject <WalletConfig>(jsonConfig);
            var signature  = KeySignature.Sign(walletFile.PrivateKey, walletFile.PublicKey);

            activeWallet = new Wallet()
            {
                Address    = walletFile.PublicKey.Trim(),
                PrivateKey = walletFile.PrivateKey.Trim(),
                Signature  = signature.Trim()
            };

            Console.WriteLine("Wallet opened successfully: " + activeWallet.Address);
        }
Ejemplo n.º 3
0
  /// <include file="documentation.xml" path="/UI/ListBase/CreateSignatureItem/*"/>
  protected virtual KeySignatureItem CreateSignatureItem(KeySignature sig)
  {
    if(sig == null) throw new ArgumentNullException();

    string name = string.IsNullOrEmpty(sig.SignerName) ? "(User ID not found)" : sig.SignerName;

    if(sig.Revocation && sig.SelfSignature) name += " (self revocation)";
    else if(sig.SelfSignature) name += " (self signature)";
    else if(sig.Revocation) name += " (revocation)";

    KeySignatureItem item = new KeySignatureItem(sig, name);

    item.SubItems.Add(sig.ShortKeyId);
    item.SubItems.Add((sig.Exportable ? "Exportable " : "Local ") + PGPUI.GetSignatureDescription(sig.Type));
    item.SubItems.Add(sig.Expired ? "Expired" : sig.IsValid ? "Valid" : sig.IsInvalid ? "Invalid" :
                      sig.ErrorOccurred ? "Error" : "Unverified");
    item.SubItems.Add(sig.CreationTime.ToShortDateString());

    return item;
  }
Ejemplo n.º 4
0
    public override void readSong()
    {
        //HEADERS
        //VERSION
        version      = readVersion();
        versionTuple = readVersionTuple();
        //INFORMATION ABOUT THE PIECE
        readInfo();
        _tripletFeel = GPBase.readBool()[0] ? TripletFeel.eigth : TripletFeel.none;
        //readLyrics();
        tempo = GPBase.readInt()[0];
        key   = (KeySignature)(GPBase.readInt()[0] * 10); //key + 0
        //GPBase.readSignedByte(); //octave
        readMidiChannels();
        measureCount = GPBase.readInt()[0];
        trackCount   = GPBase.readInt()[0];

        readMeasureHeaders(measureCount);
        readTracks(trackCount, channels);
        readMeasures();
    }
Ejemplo n.º 5
0
        void AddKeySignature(KeySignature keySignature)
        {
            EnsureVoice();

            if (parsingInlineinformationField)
            {
                voice.items.Add(new Key(keySignature));
            }
            else
            {
                foreach (var voice in tune.voices)
                {
                    if (voice.items.Count == 0)
                    {
                        voice.initialKey = keySignature;
                    }
                    else
                    {
                        voice.items.Add(new Key(keySignature));
                    }
                }
            }
        }
Ejemplo n.º 6
0
 public static bool IsFlat(this KeySignature keySignature)
 {
     return(keySignature >= KeySignature.Flats0);
 }
Ejemplo n.º 7
0
        // Convert a midi file to a song
        public Song(String fileName, List <int[]> repeats)
        {
            chords.Clear();

            BinaryReader br;

            try
            {
                br = new BinaryReader(new FileStream(fileName, FileMode.Open));
            }
            catch (IOException e)
            {
                throw e;
            } catch (ArgumentException e)
            {
                throw e;
            }

            // Read header
            byte[] header       = br.ReadBytes(14);
            String mthd         = Encoding.ASCII.GetString(header, 0, 4);
            int    headerLength = BitConverter.ToInt32(header.Skip(4).Take(4).Reverse().ToArray(), 0);
            short  format       = BitConverter.ToInt16(header.Skip(8).Take(2).Reverse().ToArray(), 0);
            short  n            = BitConverter.ToInt16(header.Skip(10).Take(2).Reverse().ToArray(), 0);
            short  division     = BitConverter.ToInt16(header.Skip(12).Take(2).Reverse().ToArray(), 0);

            Debug.WriteLine(mthd);
            Debug.WriteLine(headerLength);
            Debug.WriteLine(format);
            Debug.WriteLine(n);
            Debug.WriteLine(division);

            if (mthd != "MThd" || headerLength != 6)
            {
                throw new FileFormatException();
            }

            // Only read first chunk
            byte[] chunkHeader = br.ReadBytes(8);
            String mtrk        = Encoding.ASCII.GetString(chunkHeader, 0, 4);
            int    chunkLength = BitConverter.ToInt32(chunkHeader.Skip(4).Take(4).Reverse().ToArray(), 0);

            Debug.WriteLine(mtrk);
            Debug.WriteLine(chunkLength);

            if (mtrk != "MTrk")
            {
                throw new FileFormatException();
            }

            byte[] chunk      = br.ReadBytes(chunkLength);
            int    offset     = 0;
            bool   noteOn     = false;
            bool   endOfTrack = false;

            int          tempo   = 0;                         // microseconds per quarter note
            int          timeSig = 0;                         // quarter notes per bar
            KeySignature keySig  = new KeySignature(0, true); // Initally C Major

            byte[] noteValues = new byte[128];
            byte[] oldValues  = new byte[128];

            int reftime = 0; // Time when current time signature first started
            int ctime   = 0; // Current time of track
            int ltime   = 0; // Time of last change

            int refbar = 1;
            int cbar   = 1;

            int returnBar = 1;
            int endBar    = -1;

            if (repeats.Count > 0)
            {
                int[] repeat = repeats[0];
                repeats.RemoveAt(0);
                returnBar = repeat[0];
                endBar    = repeat[1];
            }

            bool notesChanged = false;

            while (offset < chunkLength && !endOfTrack)
            {
                int delta = GetVarLength(chunk, ref offset);
                if (delta > 0 && notesChanged)
                {
                    // Create a chord out of currently played notes
                    int  dtime = ctime - ltime;
                    byte dur   = (byte)Math.Round(4 * (double)dtime / division);
                    Debug.WriteLine("ctime: {0} ltime: {1}", ctime, ltime);
                    if (dur > 0)
                    {
                        short  bar   = (short)(((ltime - reftime) / (division * timeSig)) + refbar);
                        byte[] notes = oldValues.Select((s, i) => new { i, s }).Where(t => t.s > 0).Select(t => (byte)t.i).ToArray();
                        Debug.WriteLine(String.Format("Dur: {0} Bar: {1} Notes: {2}", dur, bar, BitConverter.ToString(notes)));
                        if (notes.Length > 0)
                        {
                            chords.Add(new Chord(notes, dur, bar));
                        }
                    }

                    Array.Copy(noteValues, oldValues, 128);

                    notesChanged = false;
                    ltime        = ctime;
                }
                ctime += delta;
                if (division != 0 && timeSig != 0)
                {
                    cbar = (int)((ctime - reftime) / (division * timeSig)) + refbar;
                    Debug.WriteLine(String.Format("Current time: {0} Current bar: {1}", ctime, cbar));
                    if (endBar != -1 && cbar > endBar)
                    {
                        cbar = returnBar;
                        if (repeats.Count > 0)
                        {
                            int[] repeat = repeats[0];
                            repeats.RemoveAt(0);
                            returnBar = repeat[0];
                            endBar    = repeat[1];
                        }
                        else
                        {
                            endBar = -1;
                        }
                    }
                }

                // Debug.WriteLine(String.Format("Time delta: {0}", delta));
                byte message = chunk[offset];
                offset++;
                if (message == 0xFF)
                {
                    // Meta event
                    byte   metaType = chunk[offset++];
                    int    vlen     = GetVarLength(chunk, ref offset);
                    byte[] vData    = chunk.Skip(offset).Take(vlen).ToArray();
                    offset += vlen;
                    switch (metaType)
                    {
                    case 0x00:
                        // Sequence number
                        short seqNum = BitConverter.ToInt16(vData.Reverse().ToArray(), 0);
                        Debug.WriteLine(String.Format("Sequence number: {0}", seqNum));
                        ltime = ctime;
                        break;

                    case 0x01:
                        // Text event
                        Debug.WriteLine(String.Format("Text: {0}", Encoding.ASCII.GetString(vData)));
                        break;

                    case 0x02:
                        // Copyright notice
                        Debug.WriteLine(String.Format("Copyright: {0}", Encoding.ASCII.GetString(vData)));
                        break;

                    case 0x03:
                        // Sequence or track name
                        Debug.WriteLine(String.Format("Sequence Name: {0}", Encoding.ASCII.GetString(vData)));
                        break;

                    case 0x04:
                        // Instrument name
                        Debug.WriteLine(String.Format("Instrument Name: {0}", Encoding.ASCII.GetString(vData)));
                        break;

                    case 0x05:
                        // Lyric text
                        Debug.WriteLine(String.Format("Lyric: {0}", Encoding.ASCII.GetString(vData)));
                        break;

                    case 0x06:
                        // Marker text
                        Debug.WriteLine(String.Format("Marker: {0}", Encoding.ASCII.GetString(vData)));
                        break;

                    case 0x07:
                        // Cue point
                        Debug.WriteLine(String.Format("Cue Point: {0}", Encoding.ASCII.GetString(vData)));
                        break;

                    case 0x20:
                        // MIDI channel prefix assignment
                        byte channel = vData[0];
                        Debug.WriteLine(String.Format("MIDI Channel Prefix: {0}", channel));
                        break;

                    case 0x2F:
                        // End of track
                        endOfTrack = true;
                        Debug.WriteLine("End of track");
                        break;

                    case 0x51:
                        // Tempo setting
                        tempo = BitConverter.ToInt32(vData.Reverse().Concat(new byte[] { 0 }).ToArray(), 0);
                        Debug.WriteLine(String.Format("Tempo: {0}", tempo));
                        break;

                    case 0x54:
                        // SMPTE offset
                        byte hr = vData[0];
                        byte mn = vData[1];
                        byte se = vData[2];
                        byte fr = vData[3];
                        byte ff = vData[4];
                        Debug.WriteLine(String.Format("SMPTE offset: hr:{0} mn:{1} se:{2} fr:{3} ff:{4}", hr, mn, se, fr, ff));
                        break;

                    case 0x58:
                        // Time signature
                        byte nn = vData[0];
                        byte dd = vData[1];
                        byte cc = vData[2];
                        byte bb = vData[3];
                        Debug.WriteLine(String.Format("Time signature: {0}/{1}", nn, Math.Pow(2, dd)));
                        Debug.WriteLine(String.Format("MIDI clocks per metronome tick: {0}", cc));
                        Debug.WriteLine(String.Format("32nd notes per MIDI quarter note: {0}", bb));
                        timeSig = (int)(nn * Math.Pow(2, 2 - dd));
                        reftime = ctime;
                        if (cbar == 2)
                        {
                            cbar--;     // Anacrusis
                        }
                        refbar = cbar;
                        break;

                    case 0x59:
                        sbyte sf    = (sbyte)vData[0];
                        bool  major = (vData[1] == 0);
                        // Key signature
                        keySig = new KeySignature(sf, major);
                        Debug.WriteLine(String.Format("Key signature: {0}", keySig.GetString));
                        break;

                    case 0x7F:
                        // Sequencer specific event
                        Debug.WriteLine(String.Format("Sequence specifier: {0}", BitConverter.ToString(vData)));
                        break;

                    default:
                        // Unknown event type
                        Debug.WriteLine("Unknown event type: {0} Len: {1} Data: {2}", metaType, vlen, BitConverter.ToString(vData));
                        break;
                    }
                }
                else if (message == 0xF0 || message == 0xF7)
                {
                    // Sysex event
                    int    vlen  = GetVarLength(chunk, ref offset);
                    byte[] vData = chunk.Skip(offset).Take(vlen).ToArray();
                    offset += vlen;
                    Debug.WriteLine("Sysex event: Len: {0} Data: {1}", vlen, BitConverter.ToString(vData));
                }
                else
                {
                    byte status = (byte)(message & 0xF0);
                    byte channel = (byte)(message & 0x0F);
                    byte key, val;
                    switch (status)
                    {
                    case 0x80:
                        // Note off event
                        noteOn = false;
                        key    = (byte)(chunk[offset] & 0x7F);
                        offset++;
                        val = (byte)(chunk[offset] & 0x7F);
                        offset++;
                        Debug.WriteLine("Note off: Key: {0} Vol: {1}", key, val);
                        if (channel == 0)
                        {
                            noteValues[key] = 0;
                        }
                        notesChanged = true;
                        break;

                    case 0x90:
                        // Note on event
                        noteOn = true;
                        key    = (byte)(chunk[offset] & 0x7F);
                        offset++;
                        val = (byte)(chunk[offset] & 0x7F);
                        offset++;
                        Debug.WriteLine("Note on: Key: {0} Vl: {1}", key, val);
                        if (channel == 0)
                        {
                            noteValues[key] = val;
                        }
                        notesChanged = true;
                        break;

                    case 0xA0:
                        noteOn = false;
                        // Polyphonic key pressure
                        key = (byte)(chunk[offset] & 0x7F);
                        offset++;
                        val = (byte)(chunk[offset] & 0x7F);
                        offset++;
                        Debug.WriteLine("Polyphonic key pressure: Key: {0} Pressure value: {1}", key, val);
                        break;

                    case 0xB0:
                        noteOn = false;
                        // Control change
                        byte controller = (byte)(chunk[offset] & 0x7F);
                        offset++;
                        val = (byte)(chunk[offset] & 0x7F);
                        offset++;
                        Debug.WriteLine("Control change: Controller number: {0} Vel: {1}", controller, val);
                        break;

                    case 0xC0:
                        noteOn = false;
                        // Program change
                        byte program = (byte)(chunk[offset] & 0x7F);
                        offset++;
                        Debug.WriteLine("Program change: {0}", program);
                        break;

                    case 0xD0:
                        noteOn = false;
                        // Channel pressure
                        val = (byte)(chunk[offset] & 0x7F);
                        offset++;
                        Debug.WriteLine("Channel pressure: {0}", val);
                        break;

                    case 0xE0:
                        noteOn = false;
                        // Pitch Wheel Change
                        short wheel = (short)((chunk[offset] & 0x7F) | ((chunk[offset + 1] & 0x7F) << 7));
                        offset += 2;
                        Debug.WriteLine("Pitch wheel change: {0}", wheel);
                        break;

                    default:
                        if (noteOn)
                        {
                            // Part of note on event
                            key = (byte)(message & 0x7F);
                            val = (byte)(chunk[offset] & 0x7F);
                            offset++;
                            Debug.WriteLine("Update note value: Key: {0} Vel: {1}", key, val);
                            noteValues[key] = val;
                            notesChanged    = true;
                        }
                        else
                        {
                            // Unknown message type
                            Debug.WriteLine("Unknown message type: {0} Data: {1}", message, chunk[offset]);
                            offset++;
                        }
                        break;
                    }
                }
            }

            br.Close();
        }
Ejemplo n.º 8
0
        /// <summary>Creates an object creation expression for an event.</summary>
        /// <param name="ev">The event to create.</param>
        /// <returns>The object creation expression for the event.</returns>
        private static CodeObjectCreateExpression CreateMetaEvent(MidiEvent ev)
        {
            CodeObjectCreateExpression newEvent = null;
            CodeExpression             delta    = new CodePrimitiveExpression(ev.DeltaTime);

            // SEQUENCE NUMBER
            if (ev is SequenceNumber)
            {
                SequenceNumber midiEvent = (SequenceNumber)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(SequenceNumber),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Number)
                });
            }

            // TEXT
            else if (ev is Text)
            {
                Text midiEvent = (Text)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(Text),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Text)
                });
            }

            // Copyright
            else if (ev is Copyright)
            {
                Copyright midiEvent = (Copyright)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(Copyright),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Text)
                });
            }

            // SEQUENCE TRACK NAME
            else if (ev is SequenceTrackName)
            {
                SequenceTrackName midiEvent = (SequenceTrackName)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(SequenceTrackName),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Text)
                });
            }

            // INSTRUMENT
            else if (ev is Instrument)
            {
                Instrument midiEvent = (Instrument)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(Instrument),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Text)
                });
            }

            // Lyric
            else if (ev is Lyric)
            {
                Lyric midiEvent = (Lyric)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(Lyric),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Text)
                });
            }

            // Marker
            else if (ev is Marker)
            {
                Marker midiEvent = (Marker)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(Marker),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Text)
                });
            }

            // CuePoint
            else if (ev is CuePoint)
            {
                CuePoint midiEvent = (CuePoint)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(CuePoint),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Text)
                });
            }

            // ProgramName
            else if (ev is ProgramName)
            {
                ProgramName midiEvent = (ProgramName)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(ProgramName),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Text)
                });
            }

            // ProgramName
            else if (ev is DeviceName)
            {
                DeviceName midiEvent = (DeviceName)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(DeviceName),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Text)
                });
            }

            // ChannelPrefix
            else if (ev is ChannelPrefix)
            {
                ChannelPrefix midiEvent = (ChannelPrefix)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(ChannelPrefix),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Prefix)
                });
            }

            // MidiPort
            else if (ev is MidiPort)
            {
                MidiPort midiEvent = (MidiPort)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(MidiPort),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Port)
                });
            }

            // EndOfTrack
            else if (ev is EndOfTrack)
            {
                EndOfTrack midiEvent = (EndOfTrack)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(EndOfTrack),
                    new CodeExpression[] {
                    delta
                });
            }

            // Tempo
            else if (ev is Tempo)
            {
                Tempo midiEvent = (Tempo)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(Tempo),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Value)
                });
            }

            // SMPTEOffset
            else if (ev is SMPTEOffset)
            {
                SMPTEOffset midiEvent = (SMPTEOffset)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(SMPTEOffset),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Hours),
                    new CodePrimitiveExpression(midiEvent.Minutes),
                    new CodePrimitiveExpression(midiEvent.Seconds),
                    new CodePrimitiveExpression(midiEvent.Frames),
                    new CodePrimitiveExpression(midiEvent.FractionalFrames)
                });
            }

            // TimeSignature
            else if (ev is TimeSignature)
            {
                TimeSignature midiEvent = (TimeSignature)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(TimeSignature),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Numerator),
                    new CodePrimitiveExpression(midiEvent.Denominator),
                    new CodePrimitiveExpression(midiEvent.MidiClocksPerClick),
                    new CodePrimitiveExpression(midiEvent.NumberOfNotated32nds)
                });
            }

            // KeySignature
            else if (ev is KeySignature)
            {
                KeySignature midiEvent = (KeySignature)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(KeySignature),
                    new CodeExpression[] {
                    delta,
                    new CodeCastExpression(typeof(Key), new CodePrimitiveExpression((byte)midiEvent.Key)),
                    new CodeCastExpression(typeof(Tonality), new CodePrimitiveExpression((byte)midiEvent.Tonality))
                });
            }

            // Proprietary
            else if (ev is Proprietary)
            {
                Proprietary midiEvent = (Proprietary)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(Proprietary),
                    new CodeExpression[] {
                    delta,
                    CreateDataArray(midiEvent.Data)
                });
            }

            // UnknownMetaMidiEvent
            else if (ev is UnknownMetaMidiEvent)
            {
                UnknownMetaMidiEvent midiEvent = (UnknownMetaMidiEvent)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(UnknownMetaMidiEvent),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.MetaEventID),
                    CreateDataArray(midiEvent.Data)
                });
            }

            // Return the event
            return(newEvent);
        }
Ejemplo n.º 9
0
        // Constructor
        public CalculateAndStoreFromInputAndAsyncTerms(CalculateAndStoreFromInputAndAsyncTermsObservableData calculateAndStoreFromInputAndAsyncTermsObservableData, IWebGet webGet, CalculateAndStoreFromInputAndAsyncTermsOptions calculateAndStoreFromInputAndAsyncTermsOptions) : base(calculateAndStoreFromInputAndAsyncTermsOptions)
        {
            Log.Trace("Constructor starting");

            _calculateAndStoreFromInputAndAsyncTermsObservableData = calculateAndStoreFromInputAndAsyncTermsObservableData;
            _webGet = webGet;
            _calculateAndStoreFromInputAndAsyncTermsOptions = calculateAndStoreFromInputAndAsyncTermsOptions;
            // Create a place to store the TransientBuffers that buffer messages while waiting For all elements that make up the ElementSets Of Term1 to finish fetching
            _transientBuffersForElementSetsOfTerm1 = new ConcurrentDictionary <string, Dataflow <IInternalMessage <string>, IInternalMessage <string> > >();

            // foreach IInputMessage<TKeyTerm1,TValueTerm1>, create an internal message that adds the hashset for the terms1  and the bool used by the routing predicate
            Log.Trace("Creating _bAccepter");
            _bAccepter = new TransformBlock <IInputMessage <string, double>, IInternalMessage <string> >(_input => { Log.Trace("Accepter received IInputMessage");
                                                                                                                     // ToDo also check on the async tasks check when an upstream completion occurs
                                                                                                                     // ToDo add exception handling to ensure the tasks, as well as the async method's resources, are released if any blocks in the dataflow fault

                                                                                                                     // create a HashSet from the set of keys found in terms1
                                                                                                                     KeySignature <string> sig = new KeySignature <string>(_input.Value.terms1.Keys);

                                                                                                                     // Is the sig.largest in the ElementSetsOfTerm1Ready dictionary? set the output bool accordingly
                                                                                                                     bool isReadyToCalculate = _calculateAndStoreFromInputAndAsyncTermsObservableData.ElementSetsOfTerm1Ready.ContainsKey(sig.Longest());

                                                                                                                     // Pass the message along to the next block, which will be either the _bSolveStore, or the _bDynamicBuffers
                                                                                                                     return(new InternalMessage <string>((_input.Value.k1, _input.Value.k2, _input.Value.terms1, sig, isReadyToCalculate))); }).ToDataflow();

            // this block accepts messages where isReadyToCalculate is false, and buffers them
            Log.Trace("Creating _bDynamicBuffers");
            _bDynamicBuffers = new DynamicBuffers(this);

            // The terminator block performs both the Solve and the Store operations
            Log.Trace("Creating _bSolveStore");
            _bSolveStore = new ActionBlock <IInternalMessage <string> >(_input => { Log.Trace($"_bSolveStore received InternalMessage having signature {_input.Value.sig.Longest()}");
                                                                                    // solve the equation for the input and all terms
                                                                                    var r1 = 0.0;
                                                                                    foreach (var kvp in _input.Value.terms1)
                                                                                    {
                                                                                        r1 += kvp.Value /
                                                                                              _calculateAndStoreFromInputAndAsyncTermsObservableData.FetchedIndividualElementsOfTerm1[kvp.Key];
                                                                                    }

                                                                                    // Store the results value
                                                                                    calculateAndStoreFromInputAndAsyncTermsObservableData.RecordR(_input.Value.k1,
                                                                                                                                                  _input.Value.k2,
                                                                                                                                                  Convert.ToDecimal(r1)); }).ToDataflow(calculateAndStoreFromInputAndAsyncTermsOptions);


            #region create asyncFetchCheckTimer and connect callback
            // Create a timer that is used to check on the async fetch tasks, the  async fetch tasks check-for-completion loop timer
            // the timer has its interval from the options passed into this constructor, it will restart and the event handler will stop the timer and start the timer each time
            // ToDo add the timer that checks on the health of the async fetch tasks check-for-completion loop every DefaultAsyncFetchTimeout interval, expecting it to provide a heartbeat,
            // The Cleanup method will call this timers Dispose method
            // the event handler's job is to call CheckAsyncTasks which will check for completed fetches and link the child Transient buffers to the _bSolveStore
            Log.Trace("creating and starting the asyncFetchCheckTimer");
            asyncFetchCheckTimer           = new Timer(_calculateAndStoreFromInputAndAsyncTermsOptions.AsyncFetchTimeInterval.TotalMilliseconds);
            asyncFetchCheckTimer.AutoReset = true;
            // set the event handler (callback) for this timer to the function for async fetch tasks check-for-completion loop
            asyncFetchCheckTimer.Elapsed += new ElapsedEventHandler(asyncFetchCheckTimer_Elapsed);
            asyncFetchCheckTimer.Start();
            #endregion create asyncFetchCheckTimer and connect callback
            _bAccepter.Name       = "_bAccepter";
            _bSolveStore.Name     = "_bSolveStore";
            _bDynamicBuffers.Name = "_bDynamicBuffers";

            // Link the data flow
            Log.Trace("Linking dataflow between blocks");
            // Link _bAccepter to _bSolveStore when the InternalMessage.Value has isReadyToCalculate = true
            _bAccepter.LinkTo(_bSolveStore,
                              internalMessage => internalMessage.Value.isReadyToCalculate);
            // Link _bAccepter to _bDynamicBuffers when the  InternalMessage.Value has isReadyToCalculate = false
            _bAccepter.LinkTo(_bDynamicBuffers,
                              internalMessage => !internalMessage.Value.isReadyToCalculate);
            // data flow linkage of the dynamically created TransientBuffer children to the _bSolveStore is complex and handled elsewhere

            // Link the completion tasks
            Log.Trace("Linking completion between blocks");
            _bDynamicBuffers.RegisterDependency(_bAccepter);
            _bSolveStore.RegisterDependency(_bAccepter);
            _bSolveStore.RegisterDependency(_bDynamicBuffers);
            // Completion linkage of the dynamically created TransientBuffer children to the _bSolveStore is complex and handled elsewhere

            Log.Trace("Registering Children");
            this.RegisterChild(_bAccepter);
            this.RegisterChild(_bSolveStore);
            this.RegisterChild(_bDynamicBuffers);

            // set the InputBlock for this dataflow graph to be the InputBlock of the _acceptor
            this._headBlock = _bAccepter.InputBlock;
            // ToDo: add an optional constructor parameter that supplies an initial list of elements that can start pre-fetching for each term
            Log.Trace("Constructor Finished");
        }
Ejemplo n.º 10
0
        private MIDI ConvertToFormat1(MIDI src)
        {
            try
            {
                Track srcTrack  = src.TrackList[0];
                var   newTracks = new List <Track>();
                int   cnt       = 0; // event counter

                var  eventlist = new LinkedList <Event>();
                uint deltaTime = 0;


                // Create Conductor track
                foreach (Event ev in srcTrack.EventList)
                {
                    deltaTime += ev.DeltaTime;

                    if (ev is MetaEvent)
                    {
                        MetaEvent modEv;
                        if (ev is SetTempo)
                        {
                            var st = (SetTempo)ev;
                            modEv = new SetTempo(deltaTime, st.Value);
                        }
                        else if (ev is TimeSignature)
                        {
                            var ts = (TimeSignature)ev;
                            modEv = new TimeSignature(deltaTime, ts.Numerator, ts.DenominatorBitShift, ts.MIDIClockPerMetronomeTick, ts.NumberOfNotesPerClocks);
                        }
                        else if (ev is KeySignature)
                        {
                            var ks = (KeySignature)ev;
                            modEv = new KeySignature(deltaTime, ks.SignatureNumber, ks.MinorFlagNumber);
                        }
                        else if (ev is SequenceTrackName)
                        {
                            var stn = (SequenceTrackName)ev;
                            modEv = new SequenceTrackName(deltaTime, stn.Name);
                        }
                        else if (ev is EndOfTrack)
                        {
                            modEv = new EndOfTrack(deltaTime);
                        }
                        else
                        {
                            modEv = new MetaEvent(deltaTime);
                        }
                        eventlist.AddLast(modEv);

                        deltaTime = 0;

                        if (!(ev is EndOfTrack))
                        {
                            cnt++;
                        }
                    }
                }
                newTracks.Add(new Track(eventlist));

                eventlist = new LinkedList <Event>();
                deltaTime = 0;


                // Create System Setup track
                foreach (Event ev in srcTrack.EventList)
                {
                    deltaTime += ev.DeltaTime;

                    if (ev is SysExEvent)
                    {
                        eventlist.AddLast(new SysExEvent(deltaTime));

                        deltaTime = 0;
                        cnt++;
                    }
                    else if (ev is EndOfTrack)
                    {
                        eventlist.AddLast(new EndOfTrack(deltaTime));
                    }
                }
                newTracks.Add(new Track(eventlist));


                // Create Notes track
                for (int ch = 0; cnt + 1 < srcTrack.EventList.Count; ch++)
                {
                    eventlist = new LinkedList <Event>();
                    deltaTime = 0;

                    foreach (Event ev in srcTrack.EventList)
                    {
                        deltaTime += ev.DeltaTime;

                        if (ev is MIDIEvent)
                        {
                            var midiEv = (MIDIEvent)ev;
                            if (midiEv.Channel == ch)
                            {
                                MIDIEvent modEv;
                                if (midiEv is NoteOn)
                                {
                                    var nton = (NoteOn)midiEv;
                                    modEv = new NoteOn(deltaTime, nton.Channel, nton.Number, nton.Velocity);
                                }
                                else if (midiEv is NoteOff)
                                {
                                    var ntoff = (NoteOff)midiEv;
                                    modEv = new NoteOff(deltaTime, ntoff.Channel, ntoff.Number, ntoff.Velocity);
                                }
                                else if (midiEv is ProgramChange)
                                {
                                    var pc = (ProgramChange)midiEv;
                                    modEv = new ProgramChange(deltaTime, pc.Channel, pc.Number);
                                }
                                else if (midiEv is Volume)
                                {
                                    var vol = (Volume)midiEv;
                                    modEv = new Volume(deltaTime, vol.Channel, vol.Value);
                                }
                                else if (midiEv is Pan)
                                {
                                    var pan = (Pan)midiEv;
                                    modEv = new Pan(deltaTime, pan.Channel, pan.Value);
                                }
                                else if (midiEv is ControlChange)
                                {
                                    var cc = (ControlChange)midiEv;
                                    modEv = new ControlChange(deltaTime, cc.Channel, cc.Value);
                                }
                                else
                                {
                                    modEv = new MIDIEvent(deltaTime, midiEv.Channel);
                                }
                                eventlist.AddLast(modEv);

                                deltaTime = 0;
                                cnt++;
                            }
                        }
                        else if (ev is EndOfTrack)
                        {
                            eventlist.AddLast(new EndOfTrack(deltaTime));
                        }
                    }
                    newTracks.Add(new Track(eventlist));
                }


                return(new MIDI(newTracks, 1, newTracks.Count, src.TimeDivision));
            }
            catch (Exception ex)
            {
                throw new Exception(Resources.ErrorMIDIFormat1, ex);
            }
        }
Ejemplo n.º 11
0
        /// <summary>Parse a meta MIDI event from the data stream.</summary>
        /// <param name="deltaTime">The previously parsed delta-time for this event.</param>
        /// <param name="eventType">The previously parsed type of message we're expecting to find.</param>
        /// <param name="data">The data stream from which to read the event information.</param>
        /// <param name="pos">The position of the start of the event information.</param>
        /// <returns>The parsed meta MIDI event.</returns>
        private static MidiEvent ParseMetaEvent(long deltaTime, byte eventType, byte [] data, ref long pos)
        {
            try
            {
                MidiEvent tempEvent = null;

                // Create the correct meta event based on its meta event id/type
                switch (eventType)
                {
                // Sequence number
                case 0x00:
                    pos++;                             // skip past the 0x02
                    int number = ((data[pos] << 8) | data[pos + 1]);
                    tempEvent = new SequenceNumber(deltaTime, number);
                    pos      += 2;                        // skip read values
                    break;

                // Text events (copyright, lyrics, etc)
                case 0x01: tempEvent = new Text(deltaTime, ReadASCIIText(data, ref pos)); break;

                case 0x02: tempEvent = new Copyright(deltaTime, ReadASCIIText(data, ref pos)); break;

                case 0x03: tempEvent = new SequenceTrackName(deltaTime, ReadASCIIText(data, ref pos)); break;

                case 0x04: tempEvent = new Instrument(deltaTime, ReadASCIIText(data, ref pos)); break;

                case 0x05: tempEvent = new Lyric(deltaTime, ReadASCIIText(data, ref pos)); break;

                case 0x06: tempEvent = new Marker(deltaTime, ReadASCIIText(data, ref pos)); break;

                case 0x07: tempEvent = new CuePoint(deltaTime, ReadASCIIText(data, ref pos)); break;

                case 0x08: tempEvent = new ProgramName(deltaTime, ReadASCIIText(data, ref pos)); break;

                case 0x09: tempEvent = new DeviceName(deltaTime, ReadASCIIText(data, ref pos)); break;

                // Channel prefix
                case 0x20:
                    pos++;                             // skip 0x1
                    tempEvent = new ChannelPrefix(deltaTime, data[pos]);
                    pos++;                             // skip read value
                    break;

                // Port number
                case 0x21:
                    pos++;                             // skip 0x1
                    tempEvent = new MidiPort(deltaTime, data[pos]);
                    pos++;                             // skip read value
                    break;

                // End of track
                case 0x2F:
                    pos++;                             // skip 0x0
                    tempEvent = new EndOfTrack(deltaTime);
                    break;

                // Tempo
                case 0x51:
                    pos++;                             // skip 0x3
                    int tempo = ((data[pos] << 16) | data[pos + 1] << 8 | data[pos + 2]);
                    tempEvent = new Tempo(deltaTime, tempo);
                    pos      += 3;
                    break;

                // SMPTE offset
                case 0x54:
                    pos++;                             // skip 0x5
                    tempEvent = new SMPTEOffset(deltaTime,
                                                data[pos], data[pos + 1], data[pos + 2], data[pos + 3], data[pos + 4]);
                    pos += 5;
                    break;

                // Time signature
                case 0x58:
                    pos++;                             // skip past 0x4
                    tempEvent = new TimeSignature(deltaTime,
                                                  data[pos], data[pos + 1], data[pos + 2], data[pos + 3]);
                    pos += 4;
                    break;

                // Key signature
                case 0x59:
                    pos++;                             // skip past 0x2
                    tempEvent = new KeySignature(deltaTime, (Key)data[pos], (Tonality)data[pos + 1]);
                    pos      += 2;
                    break;

                // Proprietary
                case 0x7F:
                    // Read in the variable length and that much data, then store it
                    long    length   = ReadVariableLength(data, ref pos);
                    byte [] propData = new byte[length];
                    Array.Copy(data, (int)pos, propData, 0, (int)length);
                    tempEvent = new Proprietary(deltaTime, propData);
                    pos      += length;
                    break;

                // An unknown meta event!
                default:
                    // Read in the variable length and that much data, then store it
                    length = ReadVariableLength(data, ref pos);
                    byte [] unknownData = new byte[length];
                    Array.Copy(data, (int)pos, unknownData, 0, (int)length);
                    tempEvent = new UnknownMetaMidiEvent(deltaTime, eventType, unknownData);
                    pos      += length;
                    break;
                }
                return(tempEvent);
            }
            // Something bad happened; wrap it in a parser exception
            catch (Exception exc) { throw new MidiParserException("Unable to parse meta MIDI event.", exc, pos); }
        }
Ejemplo n.º 12
0
        /// <summary>
        /// In MIDI Format 1, this would be the first track (index = 0).
        /// Otherwise Format 0: index = 0 and with
        /// Format 2, each track will essentially be like a Format 0 track.
        ///
        /// This method collects information from the 'tempo map' track such as
        ///
        /// - Tempo Information
        /// - SMPTE Offset
        /// - Time Signature
        /// - Key Signatuer
        /// - Sequencer Specific Data
        /// - System Exclusive Data (in tempo map)
        /// </summary>
        int GetTempoMap(int nTrackIndex, int nTrackOffset, int delta)
        {
            int  DELTA_Returned = delta;
            var  msg16          = FileHandle.Get16Bit(nTrackIndex, nTrackOffset);
            byte msg8           = (byte)(msg16 & 0xFF);

            CurrentStatus = msg16; // This is just an attempt at aligning running status.
            // var hexMsg = $"{msg16:X2}";
            if (msg16 >= 0xFF00 && msg16 <= 0xFF0C)
            {
                DELTA_Returned = FileHandle.Tracks[nTrackIndex].DeltaSeek(nTrackOffset);
                return(++DELTA_Returned);
            }
            switch (msg16)
            {
            // text
            case Stat16.SequenceNumber: // 0xFF00
            case Stat16.ChannelPrefix:  // 0xFF20
            case Stat16.PortMessage: /* 0xFF21 */ DELTA_Returned = FileHandle.Tracks[nTrackIndex].DeltaSeek(nTrackOffset); break;

            case Stat16.EndOfTrack: /* 0xFF2F */ DELTA_Returned = FileHandle.Tracks[nTrackIndex].Data.Length - 1; break;

            case Stat16.SetTempo: // 0xFF51
                var muspqn = FileHandle[ReaderIndex].ReadU24(nTrackOffset + 3);
                TempoMap.Push(muspqn, Division, CurrentTrackPulse);
                DELTA_Returned = FileHandle.Tracks[nTrackIndex].DeltaSeek(nTrackOffset);
                break;

            case Stat16.SMPTEOffset: // 0xFF54
                SMPTE.SetSMPTE(
                    FileHandle.Tracks[nTrackIndex].Data[nTrackOffset + 3],
                    FileHandle.Tracks[nTrackIndex].Data[nTrackOffset + 4],
                    FileHandle.Tracks[nTrackIndex].Data[nTrackOffset + 5],
                    FileHandle.Tracks[nTrackIndex].Data[nTrackOffset + 6],
                    FileHandle.Tracks[nTrackIndex].Data[nTrackOffset + 7]
                    );
                DELTA_Returned = FileHandle.Tracks[nTrackIndex].DeltaSeek(nTrackOffset);
                break;

            case Stat16.TimeSignature: // 0xFF58
                TimeSignature.SetSignature(
                    (int)this[nTrackIndex, nTrackOffset + 3],
                    (int)Math.Pow(-this[nTrackIndex, nTrackOffset + 4], 2),
                    (int)this[nTrackIndex, nTrackOffset + 5],
                    (int)this[nTrackIndex, nTrackOffset + 6]
                    );
                DELTA_Returned = FileHandle.Tracks[nTrackIndex].DeltaSeek(nTrackOffset);
                break;

            case Stat16.KeySignature: // 0xFF59
                KeySignature.SetSignature(
                    this[nTrackIndex, nTrackOffset + 3],
                    this[nTrackIndex, nTrackOffset + 4]);
                DELTA_Returned = FileHandle.Tracks[nTrackIndex].DeltaSeek(nTrackOffset);
                break;

            case Stat16.SequencerSpecific_70: // 0xFF70
            case Stat16.SequencerSpecific_71: // 0xFF71
            case Stat16.SequencerSpecific_72: // 0xFF72
            case Stat16.SequencerSpecific_73: // 0xFF73
            case Stat16.SequencerSpecific_74: // 0xFF74
            case Stat16.SequencerSpecific_75: // 0xFF75
            case Stat16.SequencerSpecific_76: // 0xFF76
            case Stat16.SequencerSpecific_77: // 0xFF77
            case Stat16.SequencerSpecific_78: // 0xFF78
            case Stat16.SequencerSpecific_79: // 0xFF79
            case Stat16.SequencerSpecific_7A: // 0xFF7A
            case Stat16.SequencerSpecific_7B: // 0xFF7B
            case Stat16.SequencerSpecific_7C: // 0xFF7C
            case Stat16.SequencerSpecific_7D: // 0xFF7D
            case Stat16.SequencerSpecific_7E: // 0xFF7E
            case Stat16.SequencerSpecific:    // 0xFF7F
                DELTA_Returned = FileHandle.Tracks[nTrackIndex].DeltaSeek(nTrackOffset);
                break;

            case Stat16.SystemExclusive:
                var pLastIndex = FileHandle[nTrackIndex].GetEndOfSystemExclusive(nTrackOffset);
                DELTA_Returned = pLastIndex;
                break;

            default:
            {
                if (FileHandle.Tracks[nTrackIndex].Data[nTrackOffset] < 0x80)
                {
                    CurrentStatus = CurrentRunningStatus16;
                    // Running Status
                    // int ExpandedRSE = CurrentTrackRunningStatus;// << 8;
                    int ExpandedRSE = CurrentRunningStatus8;// << 8;
                    int delta1      = -1;
                    if ((delta1 = Increment(nTrackOffset)) == -1)
                    {
                        int test = GetOffset(nTrackIndex, nTrackOffset);
                        Debug.Assert(false, string.Format("warning… {0:X2}, {1:X}|{1:N0}", ExpandedRSE, test));
                    }
                    else
                    {
                        DELTA_Returned = delta1;
                    }
                }
                else if (StatusQuery.IsMidiMessage(msg8))
                {
                    CurrentRunningStatus8  = msg8;
                    CurrentRunningStatus16 = msg16;
                    DELTA_Returned         = Increment(nTrackOffset + 1);
                    return(++DELTA_Returned);
                }
                else
                {
                    throw new FormatException("Bad format!\nThere is probably a problem with the Input File unless we made an error reading it!)");
                }
            }

            break;
            }
            return(++DELTA_Returned);
        }
Ejemplo n.º 13
0
        private TrackEvent ReadTrackEvent()
        {
            var deltaTime = ReadVariableLengthEncoding();
            // "Running Status": The last status byte is implied
            var statusByte = _lastStatusByte;
            var firstByte  = _source.ReadByte();

            // Check for new status byte
            if ((firstByte & 0x80) == 1)
            {
                statusByte = firstByte;
                firstByte  = _source.ReadByte();
            }

            var statusUpper = statusByte >> 4;

            // Save running status
            if (statusUpper > 0x7 && statusUpper < 0xF)
            {
                _lastStatusByte = statusByte;
            }
            // Parse the event
            var       statusLower = (byte)(statusByte & 0xF);
            MidiEvent ev          = null;

            switch (statusUpper)
            {
            case 0x8:
                ev = new NoteOff(statusLower, firstByte, _source.ReadByte());
                break;

            case 0x9:
                ev = new NoteOn(statusLower, firstByte, _source.ReadByte());
                break;

            case 0xA:
                ev = new PolyphonicKeyPressure(statusLower, firstByte, _source.ReadByte());
                break;

            case 0xB:
                if (firstByte < 120)
                {
                    ev = new ControlChange(statusLower, firstByte, _source.ReadByte());
                }
                else
                {
                    ev = new ChannelMode(statusLower, firstByte, _source.ReadByte());
                }
                break;

            case 0xC:
                ev = new ProgramChange(statusLower, firstByte);
                break;

            case 0xD:
                ev = new ChannelPressure(statusLower, firstByte);
                break;

            case 0xE:
                ev = new PitchBend(statusLower, firstByte, _source.ReadByte());
                break;

            case 0xF:
                switch (statusLower)
                {
                case 0x0:
                case 0x7:
                    ev = new SysEx(statusLower == 0, _source.ReadBytes(ReadVariableLengthEncoding(firstByte)));
                    break;

                case 0xF:
                    var len  = ReadVariableLengthEncoding();
                    var data = _source.ReadBytes(len);
                    switch (firstByte)
                    {
                    case 0x01:
                    case 0x02:
                    case 0x03:
                    case 0x04:
                    case 0x05:
                    case 0x06:
                    case 0x07:
                    case 0x08:
                    case 0x09:
                    case 0x0A:
                    case 0x0B:
                    case 0x0C:
                    case 0x0D:
                    case 0x0E:
                    case 0x0F:
                        ev = new TextEvent(Encoding.UTF8.GetString(data));             // TODO: Let user choose encoding
                        break;

                    case 0x20:
                        ev = new ChannelPrefix(data[0]);
                        break;

                    case 0x2F:
                        ev = new EndOfTrack();
                        break;

                    case 0x51:
                        ev = new SetTempo(MidiBytesConverter.ReadBigEndian24Bit(data));
                        break;

                    case 0x54:
                        ev = new SmpteOffset((byte)((data[0] >> 5) & 0x3), (byte)(data[0] & 0x1F), data[1], data[2], data[3], data[4]);
                        break;

                    case 0x58:
                        ev = new TimeSignature(data[0], data[1], data[2], data[3]);
                        break;

                    case 0x59:
                        ev = new KeySignature((sbyte)data[0], data[1] == 1);
                        break;

                    case 0x7F:
                        ev = new SequencerSpecificMetaEvent(data);
                        break;

                    default:
                        // TODO: Unrecognized metadata kind, non-fatal error
                        break;
                    }
                    break;

                default:
                    // At this point, if the event was not recognized: FATAL ERROR!
                    throw new NotImplementedException();
                }
                break;

            default:
                // At this point, if the event was not recognized: FATAL ERROR!
                throw new NotImplementedException();
            }

            return(new TrackEvent(deltaTime, ev));
        }
Ejemplo n.º 14
0
 /// <summary>Initializes a new <see cref="KeySignatureItem"/> with the <see cref="KeySignature"/> that it represents,
 /// and the text of the item.
 /// </summary>
 public KeySignatureItem(KeySignature sig, string text) : base(text)
 {
   if(sig == null) throw new ArgumentNullException();
   this.sig = sig;
 }
Ejemplo n.º 15
0
 /// <summary>Initializes a new <see cref="KeySignatureItem"/> with the <see cref="KeySignature"/> that it represents.</summary>
 public KeySignatureItem(KeySignature sig) : this(sig, null) { }
Ejemplo n.º 16
0
 public MetaEventAffecterKeySignature(KeySignature aKeySignature)
     : base(aKeySignature)
 {
 }
Ejemplo n.º 17
0
 public Key(KeySignature signature, ScaleType scale)
 {
     Signature = signature;
     Scale = scale;
 }
Ejemplo n.º 18
0
 public static bool IsSharp(this KeySignature keySignature)
 {
     return(keySignature > KeySignature.None && keySignature < KeySignature.Flats0);
 }
Ejemplo n.º 19
0
 public Key(KeySignature signature) : base(Item.Type.Key)
 {
     this.signature = signature;
 }
Ejemplo n.º 20
0
        /// MESSAGE PARSER see 'ParseTrackMeta'
        public virtual int GetTrackTiming(int ntrack, int position, int delta)
        {
            int  DELTA_Returned    = delta;
            byte CurrentByte       = SmfFileHandle.Get8Bit(ntrack, position);
            int  CurrentIntMessage = SmfFileHandle.Get16BitInt32(ntrack, position);

            switch (CurrentIntMessage)
            {
            case (int)MetaMsgU16FF.Text:
            case (int)MetaMsgU16FF.Copyright:
            case (int)MetaMsgU16FF.SequenceName:
            case (int)MetaMsgU16FF.InstrumentName:
            case (int)MetaMsgU16FF.Lyric:
            case (int)MetaMsgU16FF.Marker:
            case (int)MetaMsgU16FF.Cue:
            case (int)MetaMsgU16FF.Port:
            case (int)MetaMsgU16FF.SequenceNo:
            case (int)MetaMsgU16FF.Chanel:
            case (int)MetaMsgU16FF.EndOfTrack:
            case (int)MetaMsgU16FF.SMPTE:
                DELTA_Returned = GetMetaNextPos(position);
                break;

            case (int)MetaMsgU16FF.Tempo:
                MidiTimeInfo.Tempo = 60000000 / Convert.ToInt32(SmfFileHandle[ntrack].Get24Bit(position + 3));
                DELTA_Returned     = GetMetaNextPos(position);
                break;

            case (int)MetaMsgU16FF.TimeSignature:
                TimeSignature.SetSignature(
                    (int)this[ntrack, position + 3],
                    (int)Math.Pow(-this[ntrack, position + 4], 2),
                    (int)this[ntrack, position + 5],
                    (int)this[ntrack, position + 6]
                    );
                DELTA_Returned = GetMetaNextPos(position);
                break;

            case (int)MetaMsgU16FF.KeySignature:
                byte b = (this[ntrack, position + 3]);
                KeySignature.SetSignature((KeySignatureType)b, this[ntrack, position + 4] == 0);
                DELTA_Returned = GetMetaNextPos(position);
                break;

            case (int)MetaMsgU16FF.SystemSpecific:
            case (int)MetaMsgU16FF.SystemExclusive:
                DELTA_Returned = GetMetaNextPos(position);
                break;

            default:
            {
                if (CurrentByte < 0x80)
                {
                    // Running Status
                    int ExpandedRSE = RunningStatus32 << 8;
                    int delta1      = -1;
                    if ((delta1 = GetNextRsePosition(position)) == -1)
                    {
                        int test = GetOffset(position);
                        Debug.Assert(false, string.Format("warning… {0:X2}, {1:X}|{1:N0}", ExpandedRSE, test));
                    }
                    else
                    {
                        DELTA_Returned = delta1;
                    }
                }
                else if (MidiMessageInfo.IsMidiMessage(CurrentIntMessage))
                {
                    RunningStatus32 = (SmfFileHandle[ntrack, position]);
                    DELTA_Returned  = GetNextPosition(position);
                    DELTA_Returned++;
                    return(DELTA_Returned);
                }
                else
                {
                    throw new FormatException("Bad format!\nThere is probably a problem with the Input File unless we made an error reading it!)");
                }
            }

            break;
            }
            DELTA_Returned++;
            return(DELTA_Returned);
        }
Ejemplo n.º 21
0
Archivo: Meta.cs Proyecto: HLBC/uMIDI
 public KeySignatureMetaMessage(KeySignature keySignature,
                                long timeDelta)
 {
     KeySignature = keySignature;
     TimeDelta    = timeDelta;
 }