- - PR -
MIDI再生位置を音符単位でする
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-12-23 14:04
こんにちわ
VB.NETでMIDIファイルを再生するプログラムを作っています。 DirectMusicではsetstartpointやsetlooppointなどで 「曲のはじめから何秒後の位置から再生する」というような再生位置指定はできるのですが、「はじめから何番目の音符から再生する」ということはできるのでしょうか? よろしくお願いします。 | ||||||||
|
投稿日時: 2005-12-30 00:18
10数年前の記憶をたどると・・・MIDI データって、ST と GT がありますよね。音符の数って、どうやって計算しますか?
たとえば、1チャンネルから和音を出します。2分音符のドと、4分音符のミとソを出したいとします。ピアノ譜ではよくあるパターンですね。このとき、ドの ST 0 GT 960、ミの ST 480 GT 480、ソの ST 480 GT 480 のようなデータになったと思います。さて、「2つの目の音符から演奏したい」時、「2つめの音符」は、どれでしょう? あと、私はピアノ譜の入力がほとんどだったのですが、修飾音とか、グリスとか、どうします? ということで、何小節目のステップnから、のような指定をするのが普通だと思います。 _________________ | ||||||||
|
投稿日時: 2006-01-04 15:58
私はやったことないので恐縮ですが一応方法論(案)として・・・、 ベロシティーの発生回数をカウントすることは可能でしょうか? 音符の場合はベロシティー値が1以上で、休符の場合は0で良いと思います。 ただ、Jittaさんも書かれている通りタイミングの定義は必要ですね。 全く同じタイミングで2個以上のベロシティーがある場合に、 まとめて1つと見るか、別々に見るかで対応は違ってきます。 GTは音の長さですから、これは見なくても良いかと思います。 「曲のはじめから何秒後の位置から再生する」というような再生位置指定ができるのでしたら、 指定回数分のベロシティーのカウントが終わった位置から再生タイムを算出して、 その値を渡してもOKかと思います。 (こんな回りくどいことをする理由があるかどうかは別として・・・) 蛇足ですが・・・、 音符(休符)を数える際に、 何ポート分の検索をするのかも考慮する必要がありますね。 MIDI音源によって使用できるポート数が変わりますので、 ユーザーに選択させる方が良いでしょう。 ところで、このプログラムの目的が何なのかがちょっと気になったりして。
確かにグリッサンドとかは1音符ずつ入れるとかなりの数になりますよね。 話は脱線しますが、私はピッチベンドを使って終わらせます。 _________________ | ||||||||
|
投稿日時: 2006-01-05 21:10
あ、そういう方法がありましたか。確かに、MIDI コントロールも、ベロシティは送りませんものね。って、MIDI コントロール!!「n番目から演奏」だからといって、「n番目の音符から送信」したらいけませんね。コントロールコードは送信しないと、音源がリセットされなかったり、音色が違ったりと、いろいろありそうです。 私が ST と GT を出したのは、音符の種類(二分音符とか、四分音符とか)をどちらで見るか、ということでした。あるソフトで作ったスタンダード MIDI ファイルを別のソフトに読ませると、音符がすべて全音符(長さ不明)になる、ということがあったのを、思い出していました。音の長さは、今回関係なかったですね。
(._.)φグリッサンド ピッチベンドといえば、「猫の鳴き声」をピッチベンドで作ったことを思い出した(^-^; | ||||||||
|
投稿日時: 2006-01-06 15:28
一応、ベロシティーの数ではなくても、GTの数をカウントするとかでも可能です。 要は音符の数とイコールになる要素数が取れればOKですからね。 ただ、ベロシティーでのカウントであれば、音符と休符を分けてカウントが可能という利点があります。 このプログラムの利用用途がわかりませんから、念のためベロシティーが妥当かと思いました。 コントロールに関しては、前回あえて無視して返答書いてましたw スタート時間指定の再生方法でも同じ問題が発生しますからね。 通常、音源リセットなどはMIDIデータの最初の位置にセットされるだけで、 曲の途中から変わることはありませんけど、 プログラムチェンジ(音色指定)などは、曲の途中で変更しているMIDIデータが結構あります。 今回作成されるMIDIプレイヤーにプログラムチェンジに対応させる場合は、 1.該当の音符数の再生位置よりも手前にある直近のプログラムチェンジを検索(各チャンネルごとに必要) 2.MIDI音源に検索したコントロールのシグナルを送信 3.大量のコントロール送信後、すぐに再生すると、 送信データ量やMIDI音源のCPU処理の都合で音がもたる可能性がありますので、 数秒間のタイムスパンを空けてから再生するように調整。 という流れになるでしょう。 気をつけなければならない点は、 コントロールは音源リセットから読み込みを開始しないと全てが初期化されるところですね。
それは聞いてみたいですねw また蛇足ですが、イメージ的にはピッチベンドを階段状に設定していくとグリッサンド効果が得られます。 なめらかに上下させると、ギターのチョーキングみたいな効果ですね。 おそらく、猫もチョーキングも手法は同じでしょうw _________________ | ||||||||
|
投稿日時: 2006-01-07 10:40
MIDIの信号の場合、基本的にはノートオンとノートオフがあります。
ノートオンは音を鳴らし始める指令でノートオフが止める指令です。 忘れ去られることではありますが、ノートオフにもベロシティは存在します。 ただ、一般的にノートオフはベロシティ0のノートオンメッセージで 代用されることが多いです。 というのも、ランニングステータスといって、直前のメッセージの ステータスバイトと同一の場合、ステータスバイトを省略できるルールがあり、 ノートオンのベロシティ0の方がデータがコンパクトになるためです。 従って、音の数を数えるだけなら、{0x9n, k, v}の塊のvが0でないものを 数えれば出来るはずですね。 まあ、SMFを取り扱う場合、可変長の整数の取り扱いとエンディアンの 取り扱いが面倒臭いんですよね。 _________________ G.O.R.N (gorn@cworld2000.com) PGP Key fingerprints RSA: 7336 8335 5054 DFB6 BDB7 FD26 B923 A842 DSS: 47D7 2CE1 1C9D 1ED4 E62D 7122 AE31 F2BB 478D CD53 |
1