ボリューム機能の追加
ボリューム調節をつけました。
実装方法について
MIDIでボリュームをいじる時はどうすればいいでしょうか。
- デバイスのMIDIボリュームをいじる。
- チャンネル全部にVolume(コントロールチェンジの0x07番)を送信。
- チャンネル全部にExpression(コントロールチェンジの0x0B番)を送信。
- SysExメッセージでマスターボリュームを制御。
- ノートオンのベロシティを制御
方法は、いろいろありますが、問題はJavaでどれを実装するかです。
デバイスのMIDIボリュームをいじる方法
「Windows Media Player」がやらかす方法です。なんかやらかすというと変な言い方なのですが、この方法を使うと次にMIDIデバイスを利用するソフト全部に及ぶというか。
まあ、「Windows Media Player」を終了させる時に、MIDIデバイスの音量を0にするという素晴らしいことをするので、こんなのは些細なことなのですが。
まあ、そもそもJavaでは、デバイスの音量たぶん調節できないのでまず無理ということです。(できるらしいです。海外のサイト調べてたらあった。)
チャンネル全部にVolume、Expressionを送る方法
あ妥当な方法です。が実は罠があります。なぜか受け付けないSMFが存在するのです。
理由は分かりませんが、SysExメッセージで色々書いてあって何やらしているようです。うまくいくのもあるのですが、全部うまくいくとは限らないのでパスです。
補足ですが、SMFの「Volume」はチャンネルの音量。「Expression」は楽器の音量の違いらしいですよ。
SysExメッセージでマスターボリュームを制御する方法
一番楽な方法ですが、次の方法を採用しました。(特に意味はない)
ノートオンのベロシティを制御する方法
少々面倒ですが、この案を採用しました。
ノートオンのベロシティを制御する方法
制御の方法なのですが、普通音量-30とかなら、現在の音量-30とか計算しそうですが、こういう方法は自分としてはまずいと思います。というのも、人間の耳って指数とか感じる音量の変化があって線形じゃないんです。でも、もしかしたらMIDIの音量の設定ってそれもふまえて作ってあるのかな。ちょっとわかりませんが。
とりあえず、指数を利用して、現在の音量×e^-(0~2)みたいな式で音量調節することにしました。
おわりに
「Java Sound Synthesizer」の音にほれた。
以前のブログへ SMFプレイヤーをつくろう!リベンジ「完成した」
次のブログへ SMFプレイヤーをつくろう!リベンジ「出力ポートとMIDIと周波数の関係」
コメント
[…] なたで日記 いろいろな思ったこと書きますヽ(^▽^ゞ) by natade コンテンツへ移動 ホーム紹介 ← SMFプレイヤーをつくろう!リベンジ「拍子とタイムベース」 SMFプレイヤーをつくろう!リベンジ「ボリューム調節をつけよう」 → […]