投稿者 るきお  (社会人) 投稿日時 2010/6/4 22:23:43
簡単なサンプルを作ってみました。
VBのバージョンが書かれていませんでしたがVB2010でよろしかったでしょうか?

長いので分割して投稿します。


Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click

        Dim midi As New MIDIFile
        Dim track As MIDITrack = midi.NewTrack

        '長さをいじるとエラーになることが多いです 
        track.AddNote(Notes.Cs, 3, 120)
        track.AddNote(Notes.E, 3, 120)
        track.AddNote(Notes.A, 3, 120)

        track.AddNote(Notes.Cs, 4, 120)
        track.AddNote(Notes.E, 4, 120)
        track.AddNote(Notes.Fs, 4, 120)

        track.AddNote(Notes.Gs, 4, 120)
        track.AddNote(Notes.Ds, 4, 120)
        track.AddNote(Notes.B, 3, 120)

        track.AddNote(Notes.Gs, 3, 120)
        track.AddNote(Notes.Ds, 3, 120)
        track.AddNote(Notes.B, 2, 120)

        midi.Save("C:\test\test.mid")

    End Sub
End Class

Public Class MIDIFile

    Private ChunkType As New List(Of ByteFrom {&H4D, &H54, &H68, &H64}
    Private DataLength As New List(Of ByteFrom {0, 0, 0, &H6}
    Private FormatType As New List(Of ByteFrom {0, 1}

    ''' <summary> 
    ''' トラック数。テンポトラック合わせて2固定にしています。 
    ''' </summary> 
    Private TrackCount As New List(Of ByteFrom {0, 2}

    ''' <summary>音符の分解能。</summary> 
    Private TimeUnit As New List(Of ByteFrom {1, &H30}

    Public Tracks As New List(Of MIDITrack)

    Public Sub New()
        'まずテンポトラックを無条件に追加。 
        Tracks.Add(New ConductorTrack)
    End Sub

    ''' <summary> 
    ''' 新しいトラックを追加します。 
    ''' 今のところ、トラック数は2固定にしており、1つ目はテンポトラックなので 
    ''' 楽曲用トラックは1つしか作れません。 
    ''' TrackCountを{0, 3}にすればもう1ついけます。 
    ''' 自動的にTrackCountが変わるようにできればベストです。 
    ''' </summary> 
    ''' <returns></returns> 
    ''' <remarks></remarks> 
    Public Function NewTrack() As MIDITrack
        Dim track As New MIDITrack
        Tracks.Add(track)
        Return track
    End Function

    ''' <summary> 
    ''' MIDIファイルを作成します。 
    ''' </summary> 
    Public Sub Save(ByVal fileName As String)

        Dim buffer() As Byte = Me.ToArray
        IO.File.WriteAllBytes(fileName, Buffer)

    End Sub

    ''' <summary> 
    ''' 全データをMIDI形式のバイト型の配列にします。 
    ''' </summary> 
    ''' <returns></returns> 
    ''' <remarks></remarks> 
    Private Function ToArray() As Byte()

        Dim all As New List(Of Byte)
        all.AddRange(ChunkType)
        all.AddRange(DataLength)
        all.AddRange(FormatType)
        all.AddRange(TrackCount)
        all.AddRange(TimeUnit)

        For Each track As MIDITrack In Tracks
            all.AddRange(track.ToList)
        Next
        Return all.ToArray

    End Function


End Class