tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^4: VB.NETによるMIDI作曲支援ソフト〜
投稿日: 2005/11/16(Wed) 22:35
投稿者ふもふも
MIDIの詳細なことが書かれている2つのサイトを紹介します。
「B#」
hhttp://www.b-sharp.com/midi/index.html
「詳細MIDI規格」
hhttp://www.pluto.dti.ne.jp/~daiki/Midi/Midi.html
このサイトではMIDIメッセージに関する詳細な説明が
かかれておりますので、とても勉強になるとおもいます。

さて、音色をかえるには
「プログラムチェンジ」というメッセージを送信すれば
音色を設定(変更)することができます。

その前に、
なおこさんのサンプルプログラムで、音を鳴らすところを見てみますと
Dim dwMsg As Integer = &H90 + 1 + (Decimal.ToInt32(Me.NumericUpDown1.Value) * &H100)
+ 100 *
&H10000
midiOutShortMsg(Me.m_hMidiDevice, dwMsg)
となっています。
これは「ノートオン」メッセージを送信するプログラムです。
ここで、NumericUpDown1が最初の値の60だとすると
送信するデータdwMsg の値は&H103C91となります。
ですが、「ノートオン」メッセージの説明を(「B#」のサイトで)見ますと、
9n kk vv
となっております。
9n の部分に当たるdwMsgのデータは91の部分
kk の部分に当たるdwMsgのデータは3Cの部分
vv の部分に当たるdwMsgのデータは10の部分
というように、逆の順番になっていることを注意してください。
これは、CPUがリトルエンディアンであるためこのように逆の順番になるのです。
(リトルエンディアンの説明はここでは割愛させていただきます。)
さて、すでに「ノートオン」メッセージが
9n kk vv
であることは知りました。
各バイトの概要を説明すると
9n = &H90 + n :nはチャンネル番号です(0〜Fの16チャンネルが指定できます)。
kk:音階の番号で、1増えるごとに半音あがります。
vv:音の強さ(大きさといったほうがいいかな)つまりボリュームです。ベロシティーといわれていま
す。
ですので、
&H91:チャンネル1で
&H3C = 60:60番目のキー(鍵盤といったほうがいいかな)つまりドの音を
&H10 = 16:16の強さで
音を鳴らす
ということになります。

音を消すメッセージは「ノートオフ」メッセージで、
8n kk vv
nとkkは「ノートオン」メッセージと一緒ですが、
vvはキーから手を離した速度となっていますが、これは機器が対応していないと有効になりません。
対応していないときは&H40に変換されます。
先ほど「ノートオン」メッセージで鳴らした音を消すには
dwMsg のデータを&H403C81とし、送信すれば鳴らした音を消すことができます。
また、「ノートオン」メッセージでもvvの値を0にして(= &H003C91 = &H3C91)
送信すれば鳴らした音を消すことができます。

さてここで、「チャンネル」というのがでてきましたが、1チャンネルが1人の演奏者と
考えればいいでしょう。
チャンネル16まで使用可能です。つまり16人の合奏ができるということになります。

最初に音色を変えるメッセージが「プログラムチェンジ」というメッセージであると書きました。
「プログラムチェンジ」のメッセージは
Cn pp
となっています。
Cn = &HC0 + n:nはチャンネル番号
pp:音色の番号です。プログラムナンバーと呼ばれています。
GeneralMIDI規格では128の音色が定められています。
プログラムナンバーの各番号に設定されている音色は
hhttp://www.pluto.dti.ne.jp/~daiki/Midi/IL_ProgramNum.html
に表としてまとめられています。
たとえば、質問に書かれていましたギターの音を設定するには
ギターにも種類があるのでここでは「Electric Guitar(jazz)」とします。
C1 1A :チャンネル1を「Electric Guitar(jazz)」に設定する
となりますので、dwMsgには&H1AC1を入れて送信します。
「プログラムチェンジ」メッセージを送信したあとは、
「ノートオン」メッセージを送信すると設定した音色で音が鳴ります。

チャンネル一つ一つが演奏者一人一人ですので、
一人がピアノ(チャンネル1)、
一人がバイオリン(チャンネル2)、
一人がトランペット(チャンネル3)、
で、同時にドの音を鳴らすには、
C100(チャンネル1をピアノに設定)
C228(チャンネル2をバイオリンに設定)
C338(チャンネル3をトランペットに設定)
913C10(チャンネル1でドを鳴らす)
923C10(チャンネル2でドを鳴らす)
933C10(チャンネル3でドを鳴らす)
という感じでメッセージを送信します。
これをプログラムにすると
Dim dwMsg As Integer
'音色の設定
dwMsg = &HC1 '&H00C1(チャンネル1をピアノに設定)
midiOutShortMsg(Me.m_hMidiDevice, dwMsg)
dwMsg = &H28C2 '(チャンネル2をバイオリンに設定)
midiOutShortMsg(Me.m_hMidiDevice, dwMsg)
dwMsg = &H38C3 '(チャンネル3をトランペットに設定)
midiOutShortMsg(Me.m_hMidiDevice, dwMsg)
'ドを合奏
dwMsg = &H103C91'(チャンネル1でドを鳴らす)
midiOutShortMsg(Me.m_hMidiDevice, dwMsg)
dwMsg = &H103C92 '(チャンネル2でドを鳴らす)
midiOutShortMsg(Me.m_hMidiDevice, dwMsg)
dwMsg = &H103C93 '(チャンネル3でドを鳴らす)
midiOutShortMsg(Me.m_hMidiDevice, dwMsg)
'(必要な場合)合奏終了
'dwMsg = &H403C81'(チャンネル1でドを消す)
'midiOutShortMsg(Me.m_hMidiDevice, dwMsg)
'dwMsg = &H403C82 '(チャンネル2でドを消す)
'midiOutShortMsg(Me.m_hMidiDevice, dwMsg)
'dwMsg = &H403C83 '(チャンネル3でドを消す)
'midiOutShortMsg(Me.m_hMidiDevice, dwMsg)
となります。

最後に、和音を鳴らしたい場合「ノートオン」メッセージを(同時に)複数送信すれば和音となります

'ドミソ
dwMsg = &H103C91'ド
midiOutShortMsg(Me.m_hMidiDevice, dwMsg)
dwMsg = &H104091 'ミ
midiOutShortMsg(Me.m_hMidiDevice, dwMsg)
dwMsg = &H104391 'ソ
midiOutShortMsg(Me.m_hMidiDevice, dwMsg)

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。