MIDI ファイルを4キー上げて再生する

次の例では、Next MIDI を用いて、MIDI ファイルのキーを +4 した後、再生しています。

using System;
using System.IO;
using System.Text;
using NextMidi.Data.Domain;
using NextMidi.DataElement;
using NextMidi.Filing.Midi;
using NextMidi.MidiPort.Output;
using NextMidi.Time;

/* ... */

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 引数チェック
            if (args.Length != 2)
            {
                Console.WriteLine("1 port name and 1 file name required");
                return;
            }

            // MIDI ファイルを読み込み
            string fname = args[1];
            if (!File.Exists(fname))
            {
                Console.WriteLine("File does not exist");
                return;
            }
            var midiData = MidiReader.ReadFrom(fname, Encoding.GetEncoding("shift-jis"));

            // 全ての MIDI ノートを 4 半音上げる
            foreach (var track in midiData.Tracks)
            {
                foreach (var note in track.GetData<NoteEvent>())
                {
                    note.Note += 4;
                }
            }

            // テンポマップを作成
            var domain = new MidiFileDomain(midiData);

            // MIDI ポートを作成
            var port = new MidiOutPort(args[0]);
            try
            {
                port.Open();
            }
            catch
            {
                Console.WriteLine("no such port exists");
                return;
            }

            // MIDI プレーヤーを作成
            var player = new MidiPlayer(port);

            // MIDI ファイルを再生
            player.Play(domain);
        }
    }
}

MIDI 信号を再生する

次の例では、Next MIDI を用いて、簡単な MIDI 信号を再生します。

using System;
using System.Threading;
using NextMidi.DataElement;
using NextMidi.MidiPort.Output;

/* ... */

static void Main(string[] args)
{
    // MIDI ポート名を指定して MIDI ポートを開く
    if (args.Length != 1)
    {
        Console.WriteLine("1 port name required");
        return;
    }
    var port = new MidiOutPort(args[0]);
    try
    {
        port.Open();
    }
    catch
    {
        Console.WriteLine("no such port exists");
        return;
    }

    // Program No.5 に切り替え
    port.Send(new ProgramEvent(4));

    // 500 ミリ秒待つ
    Thread.Sleep(500);

    // ドレミファソラシド
    foreach (byte n in new byte[8] { 60, 62, 64, 65, 67, 69, 71, 72 })
    {
        // ベロシティ 112 でノートオンを送信
        port.Send(new NoteOnEvent(n, 112));
        Thread.Sleep(n != 72 ? 500 : 1500);
        port.Send(new NoteOffEvent(n));
    }
}

MIDI ポートを列挙する

次の例では、Next MIDI を用いて、MIDI 入力ポートと MIDI 出力ポートの一覧を取得します。

using System;
using NextMidi.MidiPort.Input.Core;
using NextMidi.MidiPort.Output.Core;

/* ... */

static void EnumInput()
{
    int count = MidiInPortHandle.PortCount;
    for (int i = 0; i < count; i++)
    {
        Console.WriteLine(MidiInPortHandle.GetPortInformation(i).szPname);
    }
}

static void EnumOutput()
{
    int count = MidiOutPortHandle.PortCount;
    for (int i = 0; i < count; i++)
    {
        Console.WriteLine(MidiOutPortHandle.GetPortInformation(i).szPname);
    }
}

static void Main(string[] args)
{
    EnumInput();
    Console.WriteLine();
    EnumOutput();
}

トラックごとのイベント数を数える

次の例では、Next MIDI を用いて、MIDI ファイルの各トラックに含まれる MIDI イベント数、ノート数、プログラムチェンジの数、コントロールチェンジの数、メタイベント数、エクスクルーシブイベント数を表示します。

using System;
using System.IO;
using System.Text;
using NextMidi.Data.Track;
using NextMidi.DataElement;
using NextMidi.DataElement.MetaData;
using NextMidi.Filing.Midi;

/* ... */

static void Main(string[] args)
{
    // MIDI ファイルを指定する
    if (args.Length != 1)
    {
        Console.WriteLine("1 source file required");
        return;
    }
    string fname = args[0];
    if (!File.Exists(fname))
    {
        Console.WriteLine("File does not exist");
        return;
    }

    // MIDI ファイルを読み込む
    var midiData = MidiReader.ReadFrom(fname, Encoding.GetEncoding("shift-jis"));

    Console.WriteLine();
    Console.WriteLine("Track Evnt Note Prog Cont Meta Excl  Title");
    Console.WriteLine("----- ---- ---- ---- ---- ---- ----  ----------------");

    for (int i = 0; i < midiData.Tracks.Count; i++)
    {
        var track = midiData.Tracks[i];

        Console.WriteLine("{0} {1} {2} {3} {4} {5} {6}  {7}",
        i.ToString().PadLeft(5),
        track.GetData<MidiEvent>().Count.ToString().PadLeft(4),
        track.GetData<NoteEvent>().Count.ToString().PadLeft(4),
        track.GetData<ProgramEvent>().Count.ToString().PadLeft(4),
        track.GetData<ControlEvent>().Count.ToString().PadLeft(4),
        track.GetData<MetaEvent>().Count.ToString().PadLeft(4),
        track.GetData<ExclusiveEvent>().Count.ToString().PadLeft(4),
        track.GetTitle(i == 0));
    }
}

NextMidi 名前空間

概要

NextMidi 名前空間には、MIDI ファイルの読み書き、MIDI データの編集および解析、MIDI 入力・出力ポートの操作、MIDI データの自動演奏のための広汎な実装が含まれています。

NextMidi.MidiPort 名前空間

NextMidi > NextMidi.MidiPort

概要

NextMidi.MidiPort 名前空間には、MIDI 入出力ポートを操作するための様々な実装が含まれています。

MidiOutPort クラス

NextMidi > NextMidi.MidiPort > NextMidi.MidiPort.Output > MidiOutPort

概要

MidiOutPort クラスは、MIDI 出力ポートを操作するための簡潔なインターフェイスを提供します。

  • コンストラクタ
    • MidiOutPort(string name)
      MIDI ポート名を指定して MIDI 出力ポートを作成します。
       
    • MidiOutPort(int index)
      MIDI ポート番号を指定して MIDI 出力ポートを作成します。
  • メソッド
    • void Close()
    • void Open()
    • void Send(IMidiEvent data)
      MIDI メッセージを送信します。
  • 拡張メソッド
    • void AllNoteOff()
    • void AllSoundOff()
  • プロパティ
    • IsOpen
    • Name
  • プロパティ (static)
    • PortCount
      MIDI 出力ポートの数を取得します。

NextMidi.Time 名前空間

NextMidi > NextMidi.Time

概要

NextMidi.Time 名前空間には、マルチメディアタイマや MIDI 演奏のための実装が含まれています。

  • クラス
  • インターフェイス
    • IMidiPlayer
    • IMidiSender
    • IMidiTimer

NextMidi.Data.Score 名前空間

NextMidi > NextMidi.Data > NextMidi.Data.Score

概要

NextMidi.Data.Score 名前空間には、MIDI データを元にテンポや拍子などの楽譜情報を解析するための実装が含まれています。

  • クラス
  • インターフェイス
    • IConductor
    • IMusicMap
    • ITempoMap

NextMidi.Data.Domain 名前空間

NextMidi > NextMidi.Data > NextMidi.Data.Domain

概要

NextMidi.Data.Domain 名前空間には、MidiData と楽譜情報をセットで扱うためのクラスが含まれています。

  • クラス
    • MidiApplicationDomain
    • MidiFileDomain
  • インターフェイス
    • IMidiApplicationDomain
    • IMidiFileDomain