Esempio n. 1
0
        public void GetTimeSignatureChanges_MultipleChanges()
        {
            var numerator1   = 2;
            var denominator1 = 16;
            var time1        = 1000;

            var numerator2   = 3;
            var denominator2 = 8;
            var time2        = 1500;

            using (var tempoMapManager = new TempoMapManager())
            {
                tempoMapManager.SetTimeSignature(time2, new TimeSignature(numerator2, denominator2));
                tempoMapManager.SetTimeSignature(time1, new TimeSignature(numerator1, denominator1));

                var tempoMap = tempoMapManager.TempoMap;
                var changes  = tempoMap.GetTimeSignatureChanges();
                Assert.AreEqual(2, changes.Count(), "Count of time signature changes is invalid.");

                var change1 = changes.First();
                Assert.AreEqual(time1, change1.Time, "Time of first change is invalid.");
                Assert.AreEqual(new TimeSignature(numerator1, denominator1), change1.Value, "Time signature of first change is invalid.");

                var change2 = changes.Last();
                Assert.AreEqual(time2, change2.Time, "Time of second change is invalid.");
                Assert.AreEqual(new TimeSignature(numerator2, denominator2), change2.Value, "Time signature of second change is invalid.");
            }
        }
Esempio n. 2
0
        public void Conversion_Musical_Musical_Subtract_TimeSignatureChanged()
        {
            //
            // 4/4               1/2  3/4
            //  |--------|--------|----|------|
            //  0        1        2  < 3   <  4
            //                       <-----<
            //
            // We are moving from 3 bars and 2 beats by 3 quarter lengths,
            // target time is 2 bars and 0.5 beats (one quarter)

            TempoMap tempoMap = null;

            using (var tempoMapManager = new TempoMapManager())
            {
                tempoMapManager.SetTimeSignature(new MusicalTime(2, 0), new TimeSignature(1, 2));
                tempoMapManager.SetTimeSignature(new MusicalTime(3, 0), new TimeSignature(3, 4));
                tempoMap = tempoMapManager.TempoMap;
            }

            var mathTime = new MathTime(new MusicalTime(3, 2),
                                        new MusicalLength(3 * MusicalFraction.Quarter),
                                        MathOperation.Subtract);

            Assert.AreEqual(TimeConverter.ConvertFrom(new MusicalTime(2, 0, MusicalFraction.Quarter), tempoMap),
                            TimeConverter.ConvertFrom(mathTime, tempoMap));
        }
        private static TempoMap GetTempoMap(IEnumerable <TimedMidiEvent> timedMidiEvents, TimeDivision timeDivision)
        {
            using (var tempoMapManager = new TempoMapManager(timeDivision))
            {
                var setTempoEvents = timedMidiEvents.Where(e => e.Event is SetTempoEvent)
                                     .OrderBy(e => e.Time, new TimeSpanComparer());
                foreach (var timedMidiEvent in setTempoEvents)
                {
                    var setTempoEvent = (SetTempoEvent)timedMidiEvent.Event;
                    tempoMapManager.SetTempo(timedMidiEvent.Time,
                                             new Tempo(setTempoEvent.MicrosecondsPerQuarterNote));
                }

                var timeSignatureEvents = timedMidiEvents.Where(e => e.Event is TimeSignatureEvent)
                                          .OrderBy(e => e.Time, new TimeSpanComparer());
                foreach (var timedMidiEvent in timeSignatureEvents)
                {
                    var timeSignatureEvent = (TimeSignatureEvent)timedMidiEvent.Event;
                    tempoMapManager.SetTimeSignature(timedMidiEvent.Time,
                                                     new TimeSignature(timeSignatureEvent.Numerator, timeSignatureEvent.Denominator));
                }

                return(tempoMapManager.TempoMap);
            }
        }
Esempio n. 4
0
        private static TempoMap GenerateComplexTempoMap()
        {
            // 4/4                                     5/8            5/16                          5/8
            //  |----+----+----+----|----+----+----+----|--+--+--+--+--|-+-+-+-+-|-+-+-+-+-|-+-+-+-+-|--+--+--+--+--|
            //  0                   1                   2              3         4         5         6              7

            var steps = new[]
            {
                Tuple.Create(2 * MusicalTimeSpan.Whole, new TimeSignature(5, 8)),
                Tuple.Create(5 * MusicalTimeSpan.Eighth, new TimeSignature(5, 16)),
                Tuple.Create(15 * MusicalTimeSpan.Sixteenth, new TimeSignature(5, 8)),
            };

            using (var tempoMapManager = new TempoMapManager(new TicksPerQuarterNoteTimeDivision(TicksPerQuarterNote)))
            {
                var time = new MusicalTimeSpan();

                foreach (var step in steps)
                {
                    time += step.Item1;
                    tempoMapManager.SetTimeSignature(time, step.Item2);
                }

                tempoMapManager.SetTempo(new MetricTimeSpan(0, 0, 10), Tempo.FromMillisecondsPerQuarterNote(300));
                tempoMapManager.SetTempo(new MetricTimeSpan(0, 1, 30), Tempo.FromMillisecondsPerQuarterNote(600));
                tempoMapManager.SetTempo(new MetricTimeSpan(0, 1, 31), Tempo.FromMillisecondsPerQuarterNote(640));

                return(tempoMapManager.TempoMap);
            }
        }
Esempio n. 5
0
        private static TempoMap GenerateSimpleTempoMap()
        {
            // 4/4                 5/8            5/16
            //  |----+----+----+----|--+--+--+--+--|-+-+-+-+-|
            //  0                   1              2         3

            using (var tempoMapManager = new TempoMapManager(new TicksPerQuarterNoteTimeDivision(TicksPerQuarterNote)))
            {
                tempoMapManager.SetTimeSignature(MusicalTimeSpan.Whole, new TimeSignature(5, 8));
                tempoMapManager.SetTimeSignature(MusicalTimeSpan.Whole + 5 * MusicalTimeSpan.Eighth, new TimeSignature(5, 16));

                tempoMapManager.SetTempo(new MetricTimeSpan(0, 0, 10), Tempo.FromMillisecondsPerQuarterNote(300));
                tempoMapManager.SetTempo(new MetricTimeSpan(0, 1, 30), Tempo.FromMillisecondsPerQuarterNote(600));

                return(tempoMapManager.TempoMap);
            }
        }
Esempio n. 6
0
        public void GetTimeSignatureAtTime_NonDefaultTempoMap_MultipleChangesAtMiddle_GetAfterSecondChange()
        {
            var numerator1   = 1;
            var denominator1 = 16;

            var numerator2   = 3;
            var denominator2 = 8;

            using (var tempoMapManager = new TempoMapManager())
            {
                tempoMapManager.SetTimeSignature(100, new TimeSignature(numerator1, denominator1));
                tempoMapManager.SetTimeSignature(1000, new TimeSignature(numerator2, denominator2));

                var tempoMap      = tempoMapManager.TempoMap;
                var timeSignature = tempoMap.GetTimeSignatureAtTime(new MidiTimeSpan(5000));
                Assert.AreEqual(new TimeSignature(numerator2, denominator2), timeSignature, "Time signature is invalid.");
            }
        }
Esempio n. 7
0
        public void GetTimeSignatureAtTime_NonDefaultTempoMap_SingleChangeAtMiddle_GetAfterChange()
        {
            var numerator   = 1;
            var denominator = 16;

            using (var tempoMapManager = new TempoMapManager())
            {
                tempoMapManager.SetTimeSignature(1000, new TimeSignature(numerator, denominator));

                var tempoMap      = tempoMapManager.TempoMap;
                var timeSignature = tempoMap.GetTimeSignatureAtTime(new MidiTimeSpan(1500));
                Assert.AreEqual(new TimeSignature(numerator, denominator), timeSignature, "Time signature is invalid.");
            }
        }
Esempio n. 8
0
        public void GetBeatLength_ChangedTimeSignature(long bars, int timeSignatureNumerator, int timeSignatureDenominator, bool changeOnEdge)
        {
            const short ticksPerQuarterNote = 100;

            TempoMap tempoMap;

            using (var tempoMapManager = new TempoMapManager(new TicksPerQuarterNoteTimeDivision(ticksPerQuarterNote)))
            {
                tempoMapManager.SetTimeSignature(new BarBeatTicksTimeSpan(changeOnEdge ? bars : bars - 1), new TimeSignature(timeSignatureNumerator, timeSignatureDenominator));
                tempoMap = tempoMapManager.TempoMap;
            }

            var length = BarBeatUtilities.GetBeatLength(bars, tempoMap);

            Assert.AreEqual(ticksPerQuarterNote * 4 / timeSignatureDenominator, length, "Beat length is invalid.");
        }
Esempio n. 9
0
        public void GetTimeSignatureChanges_SingleChange_AtMiddle()
        {
            var numerator   = 2;
            var denominator = 16;
            var time        = 1000;

            using (var tempoMapManager = new TempoMapManager())
            {
                tempoMapManager.SetTimeSignature(time, new TimeSignature(numerator, denominator));

                var tempoMap = tempoMapManager.TempoMap;
                var changes  = tempoMap.GetTimeSignatureChanges();
                Assert.AreEqual(1, changes.Count(), "Count of time signature changes is invalid.");

                var change = changes.First();
                Assert.AreEqual(time, change.Time, "Time of change is invalid.");
                Assert.AreEqual(new TimeSignature(numerator, denominator), change.Value, "Time signature of change is invalid.");
            }
        }
        public void ReplaceTempoMap_ByDefault()
        {
            using (var tempoMapManager = new TempoMapManager())
            {
                tempoMapManager.SetTempo(100, new Tempo(10));
                tempoMapManager.SetTempo(300, new Tempo(100));
                tempoMapManager.SetTimeSignature(1100, new TimeSignature(2, 4));

                var tempoMap = tempoMapManager.TempoMap;

                Assert.IsTrue(tempoMap.GetTempoChanges().Any());
                Assert.IsTrue(tempoMap.GetTimeSignatureChanges().Any());

                tempoMapManager.ReplaceTempoMap(TempoMap.Default);

                Assert.AreEqual(TicksPerQuarterNoteTimeDivision.DefaultTicksPerQuarterNote,
                                ((TicksPerQuarterNoteTimeDivision)tempoMap.TimeDivision).TicksPerQuarterNote);
                Assert.IsFalse(tempoMap.GetTempoChanges().Any());
                Assert.IsFalse(tempoMap.GetTimeSignatureChanges().Any());
            }
        }
Esempio n. 11
0
            private static TempoMap GetTempoMap()
            {
                var timeSignatureChangeOffset = 5 * TimeOffset - 1;
                var maxTime = Math.Max((TimesCount - 1) * TimeOffset, (TimesCount - 1) * TimeOffset + Length);

                bool firstTimeSignature = true;

                using (var tempoMapManager = new TempoMapManager())
                {
                    var time = 0L;

                    while (time < maxTime)
                    {
                        tempoMapManager.SetTimeSignature(time, firstTimeSignature ? FirstTimeSignature : SecondTimeSignature);

                        firstTimeSignature = !firstTimeSignature;
                        time += timeSignatureChangeOffset;
                    }

                    return(tempoMapManager.TempoMap);
                }
            }