MIDIは、Musical Instrument Digital Interface の頭文字で演奏情報を伝達するための規格
Excel_VBA_MIDI_Note On & Note Off(【耳コピ】ロンドン橋)
https://www.nicovideo.jp/watch/sm44961028ノート・メッセージは、「どの鍵盤」を、「どれくらいの強さ」で、「どれくらい押さえた」か、という情報を持っていて、メッセージを受信した「音源」がその情報をもとに演奏を再現します。
弾いた鍵を表す番号
鍵を押さえる速さ(強さ)を伝えるメッセージ
鍵を押さえたことを伝えるメッセージ
third | second | status |
---|---|---|
vvH | kkH | 9nH |
|
「ノート・オンのコード」
鍵から指を離したことを伝えるメッセージ
third | second | status |
---|---|---|
vvH | kkH | 8nH |
00H | kkH | 9nH |
※ノート・オフのとき、Velocityの数値は何でも良い。 |
「ノート・オフのコード」
second | status |
---|---|
ppH | CnH |
|
「プログラムチェンジのコード」
Byte | Description |
---|---|
F0H | System exclusive |
41H | Manufacturer ID (Roland) |
DEV | Device ID |
MDL | Model ID |
CMD | Command ID |
[BODY] | Main data |
F7H | EOX (End of exclusive) |
Dim Execlusive() As Byte 'エクスクルーシブ・メッセージを格納する変数
Type MIDIHDR
lpData As Long
dwBufferLength As Long
dwBytesRecorded As Long
dwUser As Long
dwFlags As Long
lpNext As Long
Reserved As Long
dwOffset As Long
Rev(3) As Long
End Type
Dim MIDI_HDR As MIDIHDR
#If Win64 Then
'MIDI API
Private Declare PtrSafe Function midiOutGetNumDevs Lib "winmm" () As Integer
Private Declare PtrSafe Function midiOutOpen Lib "winmm.dll" (lphMidiOut As LongPtr, ByVal uDeviceID As Long, ByVal dwCallback As LongPtr, ByVal dwInstance As LongPtr, ByVal dwFlags As Long) As Long
Private Declare PtrSafe Function midiOutShortMsg Lib "winmm.dll" (ByVal hMidiOut As LongPtr, ByVal dwMsg As Long) As Long
Private Declare PtrSafe Function midiOutLongMsg Lib "winmm.dll" (ByVal hMidiOut As Long, lpMidiOutHdr As MIDIHDR, ByVal uSize As Long) As Long
Private Declare PtrSafe Function midiOutClose Lib "winmm.dll" (ByVal hMidiOut As LongPtr) As Long
Private Declare PtrSafe Function midiOutPrepareHeader Lib "winmm.dll" (ByVal hMidiOut As Long, lpMidiOutHdr As MIDIHDR, ByVal uSize As Long) As Long
Private Declare PtrSafe Function midiOutUnprepareHeader Lib "winmm.dll" (ByVal hMidiOut As Long, lpMidiOutHdr As MIDIHDR, ByVal uSize As Long) As Long
Dim Handle As LongPtr
'Sleep API
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
'MIDI API
Private Declare Function midiOutGetNumDevs Lib "winmm" () As Integer 'midiデバイスの取得
Private Declare Function midiOutOpen Lib "winmm.dll" (lphMidiOut As Long, ByVal uDeviceID As Long, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long '開く
Private Declare Function midiOutShortMsg Lib "winmm.dll" (ByVal hMidiOut As Long, ByVal dwMsg As Long) As Long 'メッセージを送る
Private Declare Function midiOutLongMsg Lib "winmm.dll" (ByVal hMidiOut As Long, lpMidiOutHdr As MIDIHDR, ByVal uSize As Long) As Long
Private Declare Function midiOutClose Lib "winmm.dll" (ByVal hMidiOut As Long) As Long '閉じる
Private Declare Function midiOutPrepareHeader Lib "winmm.dll" (ByVal hMidiOut As Long, lpMidiOutHdr As MIDIHDR, ByVal uSize As Long) As Long
Private Declare Function midiOutUnprepareHeader Lib "winmm.dll" (ByVal hMidiOut As Long, lpMidiOutHdr As MIDIHDR, ByVal uSize As Long) As Long
Dim Handle As Long
'Sleep API
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
'-------- 中 略 ----------
'「GSリセット」の場合は、
'「F0, 41, 10, 42, 12, 40, 00, 7F, 00, 41, F7」を下記のように入力
ReDim Execlusive(10)
Execlusive(0) = &HF0
Execlusive(1) = &H41
Execlusive(2) = &H10
Execlusive(3) = &H42
Execlusive(4) = &H12
Execlusive(5) = &H40
Execlusive(6) = &H0
Execlusive(7) = &H7F
Execlusive(8) = &H0
Execlusive(9) = &H41
Execlusive(10) = &HF7
With MIDI_HDR
.lpData = VarPtr(Execlusive(0))
.dwBufferLength = UBound(Execlusive) + 1
.dwBytesRecorded = 0
.dwUser = 0
.lpNext = 0
.dwFlags = 0
End With
'出力のために、MIDI システム排他バッファまたはストリームバッファを準備する
Call midiOutPrepareHeader(Handle, MIDI_HDR, LenB(MIDI_HDR))
'指定された MIDI 出力デバイスにシステム排他 MIDI メッセージを送信する。
'(MIDI 出力デバイスのハンドル,MIDIHDR 構造体のアドレス,MIDIHDR 構造体のサイズをバイト単位で指定)
Call midiOutLongMsg(Handle, MIDI_HDR, LenB(MIDI_HDR))
'デバイスドライバがバッファでの作業を完了するまで待つ
DoEvents
'midiOutPrepareHeader 関数を使って行なった準備をクリーンアップする。
Call midiOutUnprepareHeader(Handle, MIDI_HDR, LenB(MIDI_HDR))
'エクスクルーシブ・メッセージをセルにF04110421240007F0041F7,F041104212401A15020FF7のように打ち込む場合
Dim Original_Exclusive As String 'SystemExclusiveMessageを格納する変数を宣言
Original_Exclusive = Sheets("演奏").Cells(2, 43).Value 'セルからSystemExclusiveMessageを取得
arr_Exclusive = Split(Original_Exclusive, ",") 'カンマで分割して配列に格納
For k = 0 To UBound(arr_Exclusive)
Len_Exclusive_Message = Len(arr_Exclusive(k)) / 2 - 1 '{(SystemExclusiveMessageの文字数÷2)-1}の計算
ReDim Execlusive(Len_Exclusive_Message)
For i = 0 To Len_Exclusive_Message
Execlusive(i) = "&H" & Mid(arr_Exclusive(k), (i + 1) * 2 - 1, 2)
Next i
With MIDI_HDR
.lpData = VarPtr(Execlusive(0))
.dwBufferLength = UBound(Execlusive) + 1
.dwBytesRecorded = 0
.dwUser = 0
.lpNext = 0
.dwFlags = 0
End With
Call midiOutPrepareHeader(Handle, MIDI_HDR, LenB(MIDI_HDR))
Call midiOutLongMsg(Handle, MIDI_HDR, LenB(MIDI_HDR))
DoEvents
Call midiOutUnprepareHeader(Handle, MIDI_HDR, LenB(MIDI_HDR))
Next k
Excel_VBA_MIDI_Kirby Super Star ~Aqualiss~
https://www.nicovideo.jp/watch/sm44376955Excel_VBA_MIDI_System Exclusive Message_Use For Rhythm Part
https://www.nicovideo.jp/watch/sm44968869Excel_VBA_MIDI_Bank Select and Program Change
https://www.nicovideo.jp/watch/sm44718954third | second | status |
---|---|---|
BnH | 00H | mmH |
BnH | 20H | LLH |
※バンクセレクトLSBの「LL」の数値は無視され、「LL = 00H」となる。 |
「バンクセレクトMSB、バンクセレクトLSB➡プログラムチェンジのコード」
third | second | status |
---|---|---|
vvH | 01H | BnH |
|
「Modulation code」
third | second | status |
---|---|---|
vvH | 05H | BnH |
|
「Portamento Time code」
third | second | status |
---|---|---|
vvH | 41H | BnH |
|
「Portamento code」
Excel_VBA_MIDI_Panpot
https://www.nicovideo.jp/watch/sm44741814third | second | status |
---|---|---|
vvH | 0AH | BnH |
※音の方向 |
「panpot L63-0-R63」
Excel_VBA_MIDI_Volume
https://www.nicovideo.jp/watch/sm44766477third | second | status |
---|---|---|
vvH | 07H | BnH |
|
パートの音量の変化
※Volume:絶対指定、発音中の変化には使用しない。
Expression:相対指定、発音中の音量の変化に使用。
「Volume code」
third | second | status |
---|---|---|
vvH | 0BH | BnH |
|
パートの音量の変化
※Volume:絶対指定、発音中の変化には使用しない。
Expression:相対指定、発音中の音量の変化に使用。
「expression code」
second | status |
---|---|
vvH | DnH |
|
鍵盤を弾いた後さらに押え込みその強さで発音中色々な変化を付ける(同チャンネル全てに影響)
「チャネルプレッシャーのコード」
third | second | status |
---|---|---|
vvH | kkH | AnH |
|
鍵盤を弾いた後さらに押え込みその強さで発音中色々な変化を付ける(その音のみに影響)
「ポリフォニック・キー・プレッシャーのコード」
Excel_VBA_MIDI_Hold
https://www.nicovideo.jp/watch/sm44808327third | second | status |
---|---|---|
vvH | 40H | BnH |
|
ONにしている間、ノートオフを無効化する。※使い終わったらOFFにする。
「Hold1 code」
third | second | status |
---|---|---|
vvH | 42H | BnH |
|
「Sostenuto code」
third | second | status |
---|---|---|
vvH | 43H | BnH |
|
「Soft code」
third | second | status |
---|---|---|
kkH | 54H | BnH |
|
MIDI メッセージ | 内容 | 結果 |
---|---|---|
403C90 3C54B0 404090 403C80 404080 |
Note on C4 LGC from C4 Note on E4 Note off C4 Note off E4 |
C4 on no Change re-tuning from C4 to E4 no Change E4 off |
「Legato Control code」
Excel_VBA_MIDI_Pitch Bend
https://www.nicovideo.jp/watch/sm44654720third | second | status |
---|---|---|
mmH | LLH | EnH |
|
'The pitch bend is often used to create vibrato effects and to emulate the sound of a violin or the bending strings on an electric guitar.
Excel_VBA_MIDI_All Sounds Off
https://www.nicovideo.jp/watch/sm44896288third | second | status |
---|---|---|
00H | 78H | BnH |
|
「オール・サウンド・オフ」
Excel_VBA_MIDI_Reset All Controllers ⇔ Pitch Bend
https://www.nicovideo.jp/watch/sm44907812third | second | status |
---|---|---|
00H | 79H | BnH |
|
「リセット・オール・コントローラー」
Excel_VBA_MIDI_All Notes Off
https://www.nicovideo.jp/watch/sm44901561third | second | status |
---|---|---|
00H | 7BH | BnH |
|
「オール・ノート・オフ」のコード
third | second | status |
---|---|---|
mmH | 06H | BnH |
LLH | 26H | BnH |
|
third | second | status |
---|---|---|
mmH | 63H | BnH |
LLH | 62H | BnH |
※① NRPN MSB/LSBを設定 |
NRPN MSB, LSB | Data Entry MSB |
---|---|
01H, 08H |
Vibrate rate
|
01H, 09H |
Vibrate depth
|
01H, 0AH |
Vibrate delay
|
01H, 20H |
TVF cutoff frequency
|
01H, 21H |
TVF resonance
|
01H, 63H |
TVF&TVA Env. Attack time
|
01H, 64H |
TVF&TVA Env. Decay time
|
01H, 66H |
TVF&TVA Env. Release time
|
18H, rrH |
Pitch coarse of drum instrument
|
1AH, rrH |
Pitch coarse of drum instrument
|
1CH, rrH |
Panpot of drum instrument
|
1DH, rrH |
Reverb send level of drum instrument
|
third | second | status |
---|---|---|
mmH | 65H | BnH |
LLH | 64H | BnH |
※① RPN MSB/LSBを設定 |
RPN MSB, LSB | Data Entry MSB, LSB |
---|---|
00H, 00H |
Pitch Bend Sensitivity
Excel_VBA_MIDI_Pitch Bend https://www.nicovideo.jp/watch/sm44654720 |
00H, 01H |
Master Fine Tuning
|
00H, 02H |
Master Coarse Tuning
|
7FH, 7FH |
RPN RESET
|
「Excelでmidiファイルを作る」コード