public void TestScaleGeneration()
        {
            Scale cscale = new Scale("C", Scale.ScaleTypes.Major);
             int[] cintervals = { 0, 2, 4, 5, 7, 9, 11, 0 };
             for (int i=0; i < 8; i++)
            Assert.AreEqual(cscale.GetTone(i), cintervals[i]);

             Scale dscale = new Scale("D", Scale.ScaleTypes.Major);
             int[] dintervals = { 2, 4, 6, 7, 9, 11, 1, 2 };
             //dscale.Output();
             for (int i=0; i < 8; i++) {
            //Console.WriteLine("i={0} actual={1} expected={2}", i, dscale.GetTone(i), dintervals[i]);
            Assert.AreEqual(dscale.GetTone(i), dintervals[i]);
             }
        }
 public Score(Rational timeSignature, Scale keySignature, string[] staffLabels)
 {
     this.timeSignature = timeSignature;
      this.keySignature = keySignature;
      staff = new Dictionary<string, List<Measure>>();
      foreach (string label in staffLabels) {
     staff[label] = new List<Measure>();
      }
 }
        public void TestScoreBasic()
        {
            Scale cscale = new Scale("C", Scale.ScaleTypes.Major);
             Score score = new Score(new Rational(4, 4), cscale, new string[] { "Piano", "S", "A", "T", "B" });
             score.AddMeasures(3);
             int[] yankee = { 0, 0, 2, 4, 0, 4, 2 };
             Rational[] durations = { new Rational(1, 4), new Rational(1, 4),
            new Rational(1, 4), new Rational(1, 4), new Rational(1, 4),
            new Rational(1, 4), new Rational(2, 4) };

             int item = 0;
             for (int measure=0; measure < 3; measure++) {
            bool ok = false;
            do {
               if (item < yankee.Length) {
                  ok = score.AddNote("Piano", measure, new Note(yankee[item], 0, durations[item]));
                  if (ok) {
                     //Console.WriteLine("Added note {0} to measure {1}", yankee[item], measure);
                     item++;
                  }
               } else
                  break;
            } while(ok);
             }

             // There should only be 2 of 3 measures full
             // measure one contains (C, 1/4) (C, 1/4), (D, 1/4), (E, 1/4)

             Measure m0 = score.GetMeasure("Piano", 0);
             Note m0n0 = m0.GetNote(0);
             Note m0n1 = m0.GetNote(1);
             Note m0n2 = m0.GetNote(2);
             Note m0n3 = m0.GetNote(3);

             Assert.IsTrue(m0n0.GetTone() == yankee[0] && m0n0.GetDuration().CompareTo(durations[0]) == 0);
             Assert.IsTrue(m0n1.GetTone() == yankee[1] && m0n1.GetDuration().CompareTo(durations[1]) == 0);
             Assert.IsTrue(m0n2.GetTone() == yankee[2] && m0n2.GetDuration().CompareTo(durations[2]) == 0);
             Assert.IsTrue(m0n3.GetTone() == yankee[3] && m0n3.GetDuration().CompareTo(durations[3]) == 0);

             // measure two contains (C, 1/4) (E, 1/4), (D, 1/2)
             Measure m1 = score.GetMeasure("Piano", 1);
             Note m1n0 = m1.GetNote(0);
             Note m1n1 = m1.GetNote(1);
             Note m1n2 = m1.GetNote(2);

             Assert.IsTrue(m1n0.GetTone() == yankee[4] && m1n0.GetDuration().CompareTo(durations[4]) == 0);
             Assert.IsTrue(m1n1.GetTone() == yankee[5] && m1n1.GetDuration().CompareTo(durations[5]) == 0);
             Assert.IsTrue(m1n2.GetTone() == yankee[6] && m1n2.GetDuration().CompareTo(durations[6]) == 0);

             // measure three is empty

             Measure m2 = score.GetMeasure("Piano", 2);
             Assert.IsTrue(m2.Length().CompareTo(new Rational(0, 1)) == 0);
        }