Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal 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 Byte) From {&H4D, &H54, &H68, &H64} Private DataLength As New List(Of Byte) From {0, 0, 0, &H6} Private FormatType As New List(Of Byte) From {0, 1} ''' <summary> ''' トラック数。テンポトラック合わせて2固定にしています。 ''' </summary> Private TrackCount As New List(Of Byte) From {0, 2} ''' <summary>音符の分解能。</summary> Private TimeUnit As New List(Of Byte) From {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