Beispiel #1
0
        private static void InitDomain()
        {
            var track = new MidiTrack();

            track.Insert(new TempoEvent()
            {
                Tempo = 120, Tick = 0
            });
            for (int i = 0; i < time.Length; i++)
            {
                byte note = 60;
                if (i > 2 && i % 4 == 1)
                {
                    note = 67;
                }
                if (i > 2 && i % 4 == 2)
                {
                    note = 64;
                }
                track.Insert(new NoteEvent()
                {
                    Note = note, Tick = time[i], Gate = resolution, Velocity = 64
                });
            }

            //midiDataにtrackを対応付け
            midiData = new MidiData();
            midiData.Tracks.Add(track);
            midiData.Resolution.Resolution = resolution;

            // テンポマップを作成
            domain = new MidiFileDomain(midiData);
            SetTime();
        }
Beispiel #2
0
        /// <summary>
        /// MIDIの初期化
        /// </summary>
        /// <param name="portnum"></param>
        public MidiManager()
        {
            int NumOfMode = ModeList.Length;

            //モードの数だけトラック配列の要素数を用意する
            tracks = new MidiTrack[NumOfMode];
            //モードの数だけコード進行配列の要素数を用意する
            chordProgList = new List <Chord> [NumOfMode];
            //コード進行配列の初期化
            for (int i = 0; i < NumOfMode; i++)
            {
                tracks[i]        = new MidiTrack();
                chordProgList[i] = new List <Chord>();
            }

            //Modeの数だけコード進行配列の初期化
            for (int mode = 0; mode < NumOfMode; mode++)
            {
                tracks[mode].Insert(new TempoEvent()
                {
                    Tempo = 120, Tick = 0
                });

                //コードの開始位置を0に初期化
                int ChordTickFromStart = 0;
                //入力コード進行(chordProgress)からコード進行リストを初期化する
                foreach (String chordName in inputedChord)
                {
                    //Chordの初期化
                    Chord chord = new Chord(chordName, ChordTickFromStart, mode); //Chordをインスタンス化
                    chordProgList[mode].Add(chord);                               //Modeに対応するインデックスのコード進行配列chordを追加
                    ChordTickFromStart += chord.Gate;                             //次のchordの開始タイミングにする

                    //Trackの初期化
                    tracks[mode].Insert(chord.Base); //ベース音の挿入
                    foreach (var note in chord.NoteList)
                    {
                        tracks[mode].Insert(note);                                  //伴奏音の挿入
                    }
                }
            }
            port = new MidiOutPort(0);
            try
            {
                port.Open();
            }
            catch
            {
                Console.WriteLine("no such port exists");
                return;
            }

            //midiDataにtrackを対応付け
            midiData = new MidiData();
            midiData.Tracks.Add(tracks[MODE_QUARTER]);

            // テンポマップを作成
            domain = new MidiFileDomain(midiData);
        }
Beispiel #3
0
        public static void InitAccompanimentDomain()
        {
            var track = new MidiTrack();

            track.Insert(new TempoEvent()
            {
                Tempo = 120, Tick = 0
            });
            for (int i = 0; i < 5; i++)
            {
                byte note = 60;
                track.Insert(new NoteEvent()
                {
                    Note = note, Tick = BGMtime[i], Gate = resolution, Velocity = 64, Channel = 0
                });
            }
            for (int i = 5; i < BGMtime.Length; i++)
            {
                int byteIndex = (i - 5) / 4;
                foreach (byte note in Chord.MidiNumber[byteIndex])
                {
                    track.Insert(new NoteEvent()
                    {
                        Note = note, Tick = BGMtime[i], Gate = resolution, Velocity = 64, Channel = 0
                    });
                }
            }

            for (int i = 0; i < Chord.NoteList.Length; i++)
            {
                int length = Chord.MidiNumber[i].Length * 3;
                Chord.NoteList[i] = new byte[length];
                for (int j = 0; j < 3; j++)
                {
                    Chord.NoteList[i][j]     = (byte)(Chord.MidiNumber[i][j] - 12);
                    Chord.NoteList[i][j + 3] = Chord.MidiNumber[i][j];
                    Chord.NoteList[i][j + 6] = (byte)(Chord.MidiNumber[i][j] + 12);
                }
            }
            foreach (var notes in Chord.NoteList)
            {
                for (int i = 0; i < notes.Length; i++)
                {
                    Console.Write(notes[i] + ", ");
                }
                Console.WriteLine();
            }
            //midiDataにtrackを対応付け
            BGMmidiData = new MidiData();
            BGMmidiData.Tracks.Add(track);
            BGMmidiData.Resolution.Resolution = resolution;

            // テンポマップを作成
            BGMdomain = new MidiFileDomain(BGMmidiData);
        }
Beispiel #4
0
        private static void InitDomain(string filename)
        {
            // MIDI ファイルを読み込み
            //string fname = "../../../Resources/wood.mid";// 0 | 480 1440 | 2400 2880 3360 | 4320 4800 5280 5760 | 6240 …
            string fname = filename;

            if (!File.Exists(fname))
            {
                Console.WriteLine("File does not exist");
                return;
            }
            var midiData = MidiReader.ReadFrom(fname, Encoding.GetEncoding("shift-jis"));

            // テンポマップを作成
            domain = new MidiFileDomain(midiData);
        }
Beispiel #5
0
 public static void PlayMidi(MidiFileDomain d)
 {
     // MIDI ファイルを再生
     player.Play(d);
 }