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."); }
/// <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(); } }