DOBON.NET DOBON.NETプログラミング掲示板過去ログ

MIDI演奏のテンポの変更と転調

環境/言語:[VB.NET]
分類:[.NET]

またMIDI演奏のことで質問なのですが、MIDIファイルのテンポの変更をするため

mciSendString("Open """ & MIDIFileName & """ Alias MIDI", "", 0, 0)
mciSendString("Set MIDI tempo 200", "", 0, 0)
mciSendString("Play MIDI ", "", 0, 0)

のようなプログラムを組んだのですがテンポが元のままで変更できません。
どのようにしたら変更できるのでしょうか。

また、何度か移調したいのですが調べてみても転調方法がわかりません。テンポと同じように mciSendString でできるのでしょうか??
■No16955に返信(subaruさんの記事)
> どのようにしたら変更できるのでしょうか。

Playの後にtempoを変更すれば変更できるようです。

<System.Runtime.InteropServices.DllImport("winmm.dll")> _
Shared Function mciSendString( _
ByVal command As String, _
ByVal buffer As System.Text.StringBuilder, _
ByVal bufferSize As Int32, _
ByVal hwndCallback As IntPtr _
) As Int32
End Function

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim ptrZero As IntPtr = IntPtr.Zero
Dim MIDIFileName As String = "C:\test.mid"

mciSendString("Open """ + MIDIFileName + """ Alias MIDI", Nothing, 0, ptrZero)
mciSendString("Play MIDI", Nothing, 0, ptrZero)
mciSendString("Set MIDI tempo 200", Nothing, 0, ptrZero)
End Sub

> また、何度か移調したいのですが調べてみても転調方法がわかりません。テンポと同じように mciSendString でできるのでしょうか??

分かりません。できないとは思いますが...。

http://www.geocities.com/smigman.geo/mci/riffmci.html
>>また、何度か移調したいのですが調べてみても転調方法がわかりません。テンポと同じように mciSendString でできるのでしょうか??

mciSendStringではできないと思います。
移調するにはSMFを解析し,ノートオンとノートオフの音階をずらして新しいSMFを生成するなどしなければならないと思います。
新しいSMFの生成を避けるには,SMFを理解して演奏する専用のプレイヤーを作ることになると思います。

ちなみに,「移調」は音階をずらすことで,「転調」は長調から短調への変更も意味に含めると思います。

前に,移調・転調するMIDIプレイヤーを作ったことがあります。暗いジングルベルや明るいドナドナなどを演奏して楽しみました。

http://homepage1.nifty.com/yasunari/Soft/Soft001.htm

ソースがどこかに保存されていたと思うので探してみます。(VB6ですが)
ソースありました。アップロードしたので参考にしてください。

http://homepage1.nifty.com/yasunari/Soft/HesomagariMIDIPlayer.zip

SMFを解析しながら構造体に読み込み,ノートオン・ノートオフの音階を書き換え,それをテンポラリSMFに吐き出しMCIコントロールで再生する仕様です。
構造体の内容のメモもあったので入れておきました。

ずっと前に作ったものなので稚拙な作りで恥ずかしいものですが,参考になれば幸いです。(当時はクラスというものがまだよくわからなかったのです...)

DOBON.NET | プログラミング道 | プログラミング掲示板