tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVB.NETによるMIDI作曲支援ソフト〜
記事No2555
投稿日: 2005/11/11(Fri) 15:00
投稿者アチョウ
はじめまして、私は現在大学に通うものですが、卒業研究が「VB.NETによるMIDI作曲支援ソ
フト〜」です。そこで様々なサイトを探してるのですが、目的に合ったサイトが見当たりません。
 1.画面構造的には → 鍵盤の画面が移っている。
 2.音符を入力する使用は → キーボードに各音階の音を振り分けて、押す時間で音の長さが指定


すみませんがMIDIをプログラムで作る内容が乗っているサイト、もしくは諸本を教えていただけ

いでしょうか?

何でもかまいません!

[ツリー表示へ]
タイトルRe: VB.NETによるMIDI作曲支援ソフト〜
記事No2560
投稿日: 2005/11/12(Sat) 14:45
投稿者なおこ(・∀・)
お世話になります。

おもしろそうだったんで、ちょっと調べてみました。
で、音を鳴らすだけだったら出来ました。
ただ私もあまり詳しい事は解らないので、質問されても回答できないかもしれません(汗
使っているAPIの関数名などでGoogle検索してみると、色々情報が得られるかと思います。

参考にした所を書いときます。
[MIDI の基本]
hhttp://wisdom.sakura.ne.jp/system/winapi/media/mm11.html
[43.MIDI音源を使用して音を鳴らす]
hhttp://homepage1.nifty.com/MADIA/vb/API/MidiOutShortMsg.htm
[midiOutShortMsg]
hhttp://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/jpmltimd/html/_win32_midioutshortmsg.asp
hhttp://yokohama.cool.ne.jp/chokuto/urawaza/api/midiOutShortMsg.html
[MIDIデバイスを直接鳴らす]
hhttp://www.skai.co.jp/arufonsu/vb/VB-002-07-003.htm
[MIDI外部機器をVBでコントロールする]
hhttp://www.cs.k.tsukuba-tech.ac.jp/labo/koba/software/midi.html
[Programming with MIDI in VB.Net]
hhttp://tomgroves.net/projects/vbmidi/

===============================================================
Form には NumericUpDown コントロール 1 個と
Button を 1 個、配置しています。
===============================================================
Imports System.Runtime.InteropServices

Public Class Form2
    Inherits System.Windows.Forms.Form

    'MIDIデバイスをOpen
    <DllImport("winmm.dll", CharSet:=CharSet.Auto)> _
    Private Shared Function midiOutOpen( _
                            ByRef hMidiOut As Integer, _
                            ByVal uDeviceID As Integer, _
                            ByVal dwCallback As Integer, _
                            ByVal dwInstance As Integer, _
                            ByVal dwFlags As Integer) As Integer
    End Function

    'MIDIデバイスをClose
    <DllImport("winmm.dll", CharSet:=CharSet.Auto)> _
    Private Shared Function midiOutClose( _
                            ByRef hMidiOut As Integer) _
                            As Boolean
    End Function

    <DllImport("winmm.dll", CharSet:=CharSet.Auto)> _
    Private Shared Function midiOutShortMsg( _
                        ByVal hMidiOut As Integer, _
                        ByVal dwMsg As Integer) _
                        As Integer
    End Function

    'MIDIデバイスハンドル
    Private m_hMidiDevice As Integer

    Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles
MyBase.Load
        Dim ret As Integer = midiOutOpen(Me.m_hMidiDevice, -1, 0, 0, 0)
        If ret <> 0 Then
            MessageBox.Show("Device の Openに失敗")
        End If
        Me.NumericUpDown1.Minimum = 0
        Me.NumericUpDown1.Maximum = 127
        Me.NumericUpDown1.Value = 60 '60がドの音かな?
    End Sub

    '音を鳴らす
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
        Dim dwMsg As Integer = &H90 + 1 + (Decimal.ToInt32(Me.NumericUpDown1.Value) * &H100)
+ 100 * &H10000
        midiOutShortMsg(Me.m_hMidiDevice, dwMsg)
    End Sub

    Private Sub Form2_Closing(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        If Not midiOutClose(Me.m_hMidiDevice) Then
            MessageBox.Show("Device の Closeに失敗")
        End If
    End Sub
End Class

[ツリー表示へ]
タイトルRe^2: VB.NETによるMIDI作曲支援ソフト〜
記事No2565
投稿日: 2005/11/14(Mon) 11:22
投稿者アチョウ
>なおこさんTHANKです!!
いま、がんばって研究を続けてます。

[ツリー表示へ]
タイトルRe^3: VB.NETによるMIDI作曲支援ソフト〜
記事No2570
投稿日: 2005/11/14(Mon) 15:22
投稿者アチョウ
鍵盤にそれぞれ音を振り分けることができました。
申し訳ないのですが、もうひとつ質問いいでしょうか?
音色を数十種類に増やしたいのですが、その場合は数値を変えたりすればいいのでしょうか?
ギターの音を出すにはどうすれば?...

[ツリー表示へ]
タイトルRe^4: VB.NETによるMIDI作曲支援ソフト〜
記事No2603
投稿日: 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)

[ツリー表示へ]
タイトルRe^5: VB.NETによるMIDI作曲支援ソフト〜
記事No2605
投稿日: 2005/11/18(Fri) 09:21
投稿者アチョウ
>ふもふもサン
ありがとうございます!!大変参考になりました。
皆さんに協力いただき大変感謝の意に存じます。
頑張ってすばらしい作品を作りたいと思います。

[ツリー表示へ]
タイトルRe^6: VB.NETによるMIDI作曲支援ソフト〜
記事No2634
投稿日: 2005/11/24(Thu) 15:08
投稿者アチョウ
1.音色表をデータベースに保存して、コンボボックスを利用して0〜127までの音色の登録ができました。
1-2.
EX1)ガンショットなら&H7FC1のようにデータベースに入れました。

2.ラジオボタンを使ってオクターブの変化を5段階まで可能にしました。

現段階はこんな感じです!!
そこで、ドラムの音はどう入れたらいいのかわかりません。10chを使っていると書いてるのですが、
少々こんがらがってわからなくなってきました(>、<)
ドラムの音ってどう出せばいいのでしょうか?

[ツリー表示へ]
タイトルRe^7: VB.NETによるMIDI作曲支援ソフト〜
記事No2684
投稿日: 2005/11/30(Wed) 20:13
投稿者ふもふも
ほかの音と同じようにノートオンメッセージで音を出せばいいですよ。
ch10はGeneralMIDI規格で定められているチャンネルでリズム用チャンネルと呼ばれています。
このチャンネルにはリズム用の特別な音色が設定されています。
これは前回で紹介した音色リストの下の表でまとめられています。
このリズム用チャンネルではノートオフメッセージは不要です。(送信しても無視されます)
このチャンネルでは、「シングルアサイン」と呼ばれる発音方法がとられます。
「シングルアサイン」とは、同じノートナンバーで1回目音を出して次に2回目に音を出す時に1回目

音は消してから音を出すというものです。
また、
Closed Hi-Hat(ノートナンバー42)
Pedal Hi-Hat(ノートナンバー44)
Open Hi-Hat(ノートナンバー46)
この3つのノートナンバーにおいては「オルタネートアサイン」と呼ばれる発音方法をとります。
ハイハットを閉じてたたいた時、
ハイハットペダルでシンバルを鳴らした時、
ハイハットを開いてたたいた時、
の音で、1つの楽器なのでこれを同時に鳴らすことは(物理的に)不可能です。
ですので、ノートオンするときこの3つのどれかがなっている場合はその音を消してから発音します。
これが「オルタネートアサイン」の発音方法です。
つまり、「シングルアサイン」を複数のノートナンバーに対応させたものが「オルタネートアサイン」
です。
GeneralMIDI規格内ではこのハイハットだけですが、ヤマハのXGやローランドのGSといった拡張された
MIDI音源においては、これ以外にも「オルタネートアサイン」が設定されている音色が有ります。

[ツリー表示へ]
タイトルRe^8: VB.NETによるMIDI作曲支援ソフト〜
記事No2686
投稿日: 2005/12/01(Thu) 09:41
投稿者アチョウ
ふもふもサン!!ありがとうございました!!
無事解決しました!!これからもお世話になると思いますので宜しくお願い申し上げます!!

[ツリー表示へ]