public MidiIntegrationFacade(Midi.OutputDevice outputDevice)
 {
     this.outputDevice = outputDevice;
 }
Esempio n. 2
0
        static void Main(string[] args)
        {
            int length = 3;

            List <Note>  keys        = new List <Note>(Utils.GetNoteRange(Utils.Range(-7, 8), new NoteLengths[] { NoteLengths.Whole, NoteLengths.DoubleWhole }));
            Queue <Note> currentKeys = new Queue <Note>();

            for (int i = 0; i < length; i++)
            {
                currentKeys.Enqueue(new Note(0, NoteLengths.Whole));
            }

            Console.Write("Creating Markov Chain... ");
            var mc = new MarkovChain <Note>(keys, length, rand);

            Console.WriteLine("Done");

            int nbResults = 100;

            Console.Write("Playing chain results ({0})... ", nbResults);

            Midi.OutputDevice outputDevice = Midi.OutputDevice.InstalledDevices[0];
            outputDevice.Open();
            outputDevice.SendProgramChange(Midi.Channel.Channel1, Midi.Instrument.Celesta);

            int totalTime = 0;

            for (int i = 0; i < nbResults; i++)
            {
                Note result = mc.Resolve(currentKeys.ToList(), rand);

                Midi.Pitch currentRoot;
                switch ((int)((float)totalTime / 4000f) % 4)
                {
                case 0:
                    currentRoot = Midi.Pitch.C4;
                    break;

                case 1:
                    currentRoot = Midi.Pitch.G3;
                    break;

                case 2:
                    currentRoot = Midi.Pitch.C4;
                    break;

                case 3:
                    currentRoot = Midi.Pitch.A4;
                    break;

                default:
                    currentRoot = Midi.Pitch.C4;
                    break;
                }

                outputDevice.SendNoteOn(Midi.Channel.Channel1, currentRoot + Scale.NaturalMinor.GetScaleStepsTo(result.RelValueToTonic), 80);

                currentKeys.Dequeue();
                currentKeys.Enqueue(result);

                int noteLength = (int)(1000f * result.NoteLength.Value);
                totalTime += noteLength;

                System.Threading.Thread.Sleep(noteLength);
            }
            Console.WriteLine("Done");

            Console.ReadLine();
        }