public void SetStep()
        {
            Assert.AreEqual(MusicalTimeSpan.Quarter, PatternBuilder.DefaultStep, "Default step is invalid.");

            var patternBuilder = new PatternBuilder();

            Assert.AreEqual(PatternBuilder.DefaultStep, patternBuilder.Step, "Invalid initial step.");

            var step = new BarBeatFractionTimeSpan(0, 2.5);

            patternBuilder.SetStep(step);
            Assert.AreEqual(step, patternBuilder.Step, "Invalid step after change.");
        }
Beispiel #2
0
        /// <summary> Constructs an IMidiFile instance based on a MIDI file stream.</summary>
        /// <param name="stream"> stream of the midi file content. </param>
        /// <param name="disposeStream"> Set true if stream is to be closed by the constructor once it's done reading the file. </param>
        internal DryWetMidiAdapter(Stream stream, bool disposeStream = false)
        {
            // initialization
            Stream          = stream;
            stream.Position = 0;
            _midiContent    = MidiFile.Read(stream);
            _tempoMap       = _midiContent.GetTempoMap();
            IList <TrackChunk> trackChunks = _midiContent.GetTrackChunks().ToList();

            _metadataTrack = trackChunks.First();
            _metaEvents    = _metadataTrack.Events.ToList();

            // set midi title property
            Title = (((from e in _metaEvents
                       where e.EventType == MidiEventType.SequenceTrackName
                       select e).First()) as BaseTextEvent)?.Text ?? "Undefined";

            // set key signature property
            TimeSignatureEvent timeSignatureEvent = (from e in _metaEvents
                                                     where e.EventType == MidiEventType.TimeSignature
                                                     select e)?.First() as TimeSignatureEvent;

            KeySignature = MusicTheoryFactory.CreateDuration(timeSignatureEvent.Numerator, timeSignatureEvent.Denominator, false);

            // set number of bars property
            BarBeatFractionTimeSpan duration = _midiContent.GetDuration <BarBeatFractionTimeSpan>();

            NumberOfBars = (int)duration.Bars + (int)Math.Ceiling(duration.Beats / timeSignatureEvent.Numerator);

            // set BPM property
            BeatsPerMinute = (byte)(_midiContent.GetTempoMap()?.Tempo.AtTime(0).BeatsPerMinute);

            // set MIDI pitch range
            IEnumerable <DWMidiI.Note> notes = _midiContent.GetNotes();

            LowestPitch  = (NotePitch)(byte)(notes.Min(note => note.NoteNumber));
            HighestPitch = (NotePitch)(byte)(notes.Max(note => note.NoteNumber));

            // dispose stream if requested
            if (disposeStream)
            {
                stream.Dispose();
            }
        }