FlMML - 非線形音量モード
ようやく、音量モードの変更を実装しました!
何のことだか分からないひとにはサッパリだと思いますが、分かる人には「今更か!」と怒られるような機能ですよね、これ。
ま、とにかく いつものようにサンプルを。
最初に x1(非線形モード)、続いて今までの x0(線形モード)で音が流れます。
後のほうが全体的にベタっとした感じなのが分かりますか?
アタック部分が潰れちゃってるし、後半はフェードインしてるのにあまり音量が変わらない感じになっちゃってます。
音というのは空気の振動であって、振幅が大きいほど音量が大きくなる…っていうのはご存知のかたが多いかと思います。
ただ、人間の耳というのは、振幅が2倍になったからって音量が倍になったように聞こえるわけじゃないんですよね。
そこで、人間の耳に適正に聞こえるような音量モードをつけてみたと。
もう x1 がデフォルトでもいいんじゃないかって気もするんですが、互換性なくなっちゃいますからね。すみませんが毎度毎度 x1 って書いてください。
一応、x0のほうが 少~しだけ動作が軽いと思います。
追記:ダウンロードはこちら。書き忘れてました…。
何のことだか分からないひとにはサッパリだと思いますが、分かる人には「今更か!」と怒られるような機能ですよね、これ。
ま、とにかく いつものようにサンプルを。
最初に x1(非線形モード)、続いて今までの x0(線形モード)で音が流れます。
The Flash movie is here. JavaScript enabled please.
後のほうが全体的にベタっとした感じなのが分かりますか?
アタック部分が潰れちゃってるし、後半はフェードインしてるのにあまり音量が変わらない感じになっちゃってます。
音というのは空気の振動であって、振幅が大きいほど音量が大きくなる…っていうのはご存知のかたが多いかと思います。
ただ、人間の耳というのは、振幅が2倍になったからって音量が倍になったように聞こえるわけじゃないんですよね。
そこで、人間の耳に適正に聞こえるような音量モードをつけてみたと。
もう x1 がデフォルトでもいいんじゃないかって気もするんですが、互換性なくなっちゃいますからね。すみませんが毎度毎度 x1 って書いてください。
一応、x0のほうが 少~しだけ動作が軽いと思います。
追記:ダウンロードはこちら。書き忘れてました…。


あっ,V の値と出音との関係式は,知りたいと思っていました.
ソースを読めばいいのですけれど,なかなか(^^;).
V の値を x ,出音を y とすると,
X0 が y = ax + b で,
X1 が y = a log(x) + b という感じでしょうか.
ひょっとして,エンベロープも変わっていますか?
あと V の値が 0 のときは音は出なくて,ミュートがわりに使える,と思っていてよいでしょうか?
投稿: NOIKE | 2008.07.07 07:58
どうもですー。
127がMAX、MAXのとき1.0として、振幅を
x0のときは y = x / 127
x1のときは y=pow(10.0, (x-127.0)*(48.0/(127.0*20.0)))
ただしxがゼロのときは特例としてy=0としてますので、仰るとおりミュートになります。
-48dbから0dbのときの振幅はこうかなーと思ったんですが、もしかしてlogが正解でした!?(ドキドキ)
MINが-48dbっていうのでさえも耳で聞いて適当にあわせてますけどね・・・。
エンベロープも同様に変えてます。
ついでに、@vとvの関係は
@v = v * 8 +7
になってます。
投稿: おー | 2008.07.08 01:43
どうでもいい話。
七夕さまを作ったつもりだったのに
きらきら星じゃん、これ。
素で間違った…。
投稿: おー | 2008.07.08 01:45
おぉぉ!
@v と合わせて,これは,イイコトを教えていただいたかもしれない!
あとで,mml2mp3 の変換式を見直しておきます.
pow(指数関数)の逆関数は log になるので,数学的には係数しだいで一致することになります.
dB の変換式には,底が 10 の log が使われますが,人間の耳の感度は音圧に対して,指数的(対数的)に変化すると言われているので,だいたい当たっているのではないかと想像しています.
変換式を教えてくださって,ありがとうございました.
投稿: NOIKE | 2008.07.09 06:55
内部の式については大概答えられますので気軽にどぞ。
フィルタの係数の求め方とかはよく分かんないで漬かっちゃってますけどね(--;)
投稿: おー | 2008.07.11 02:21
http://d.hatena.ne.jp/korinchan/20071021/p1
の
ドラム(上からハイハット、スネアドラム、バスドラム)
のMMLについて、
CodeReposでのrev.13769から再生結果が大きく変わっているようですー。
一応ご報告させていただきます。
投稿: グニャラくん | 2008.09.01 02:24
↑の続報です。
MStatusにてENVELOPE2_ADとENVELOPE2_SRがNOISE_FREQとPWMとかぶっていたので、
とりあえず定数の互換性を重視して
ENVELOPE2_ADとENVELOPE2_SRに新しく定数を振りなおして勝手にコミットしちゃいました。
問題がありましたら上書きコミットお願いいたします!
投稿: グニャラくん | 2008.09.01 16:27
うわ~~本当だ!!
報告いただいたうえにバグとりまでして頂いちゃって、すみません。
初歩的過ぎるミスですね・・・enum欲しい(;;)
コミットしていただいた修正で全く問題ありません。ありがとうございました!
ピコカキコでの採用もありがとうございました!
率直に言ってすげー嬉しいです。
投稿: おー | 2008.09.03 01:12
あー、コミット時にswfのバイナリも差し替えて一緒にコミットしておけばよかったですね…すみません。
enum欲しいですねー!
素晴らしいライブラリの公開ありがとうございます!!
そいえば、ピコカキコに、以下のような要望が来ていましたよー。
----
とりあえず言ってみるテスト。あるといいな系の提案。
・ポルタメント実装 > *
a*bx で、ab間をx分音符の長さでポルタメント。
ex) c2&c*>c2&c1 2分音符のcとcから1oct.ポルタメントする2分と
cの全音符を全てタイでつなげて滑らか~に。
・ゲートタイム指定2 > @qx
ゲートタイムを指定音符から全音符のx/192の長さを引いた長さにする。
・トランスポーズ > nsx
xで指定した分、移調させる。
ex) ns5 で、cがへ長調のI度に。
TSSCPに文法合わせるとなるとこんな感じなんですが如何でしょ?
----
コピペでサーセンw
投稿: グニャラくん | 2008.09.03 20:06
言われるまで気づかなかった…。swfコミットしておきましたので大丈夫です。
トランスポーズは元々入れるつもりだったんで暇を見つけて入れてみます。
ゲートタイム指定2は考えてなかったんですが、言われてみれば便利かもしれないですね。検討します。
ポルタメントは僕も好きなんで入れたいんですが、ちょっと面倒くさいので後回しになっちゃいそうな予感がします。
ご意見ありがとうございました~~。
投稿: おー | 2008.09.04 01:28