2006/03/15(水) [n年前の日記]
#1 [iappli] サウンド関係について調べてたり
そもそも何を鳴らせるのかわからんのだけど。FM音源なのか、PCM音源なのか。
昔の携帯は、FM音源+ADPCMとかだったらしい。今のは、FM音源+PCM音源とか。PCM音源16音なんて話も見かけてビックリ。一昔前のゲーム機並みだな…。
_ヤマハ音源LSI YMU765 『MA-5』
昔の携帯は、FM音源+ADPCMとかだったらしい。今のは、FM音源+PCM音源とか。PCM音源16音なんて話も見かけてビックリ。一昔前のゲーム機並みだな…。
◎ YAMAHAのツールで .mid → .mmf → .mld に変換。 :
最初は、
_着メロ超入門
というページを参考に、
_着メロコンバータ
で、いきなり mid → mld 変換したのだけど。出力された .mld を
_YAMAHA MidRadio Player
にD&Dしたら、「サポートしてないフォーマットだ」と言われてしまった。まあ、MidRadio Player で鳴らなくても、実機で鳴る可能性はありそうだけど。
とりあえず、 _YAMAHAのツール で試しに変換してみたり。
SSD-122-j.zip を解凍。Installer/setup.exe を実行してインストール。起動。.mid を開いて、音色の傾向を選んで再生してみてから、「save as…」で保存。この時点で .mmf ができる。
SCP-MA-N-110-j.zip を解凍してインストール。Bin/SCP-MAX.exe を起動。.mmf をウインドウにD&D。これで .mld が出力された。
出力された .mld を MidRadio Player に D&D。鳴ってくれた。… MidRadio Player は、YAMAHA製音源チップの音色を持ったソフトウェアMIDI音源を内蔵してるらしいので、たぶん実機の音色に近いところもあるのであろうとほんのり期待。 *1
ちょっと気になるのは、SCP-MA-N-110-j.txt に、以下のような注意書きがあったこと。
MA5_AT の、ATS-MA5-N-D230-j/MA音量バランスについて-ATS.pdf を覗いたら関連記述が。
もう一つ気になるのは、ここで作った .mld は、N50x 以外でも鳴らせるのか判らないこと。YAMAHA サイトの、 _対応端末の情報ページ には、Nxxx しか書いてないわけで。他メーカの製品は、違った音源チップを乗せてるということなんだろうか。
どの機種でも共通で鳴らせるデータを作る方法を知りたいのだけど、もしかすると無理なのかしら。…なんとなくMSXを思い出してしまう。 *2
何にせよ、次はwavを変換できるか試してみないと。
とりあえず、 _YAMAHAのツール で試しに変換してみたり。
SSD-122-j.zip を解凍。Installer/setup.exe を実行してインストール。起動。.mid を開いて、音色の傾向を選んで再生してみてから、「save as…」で保存。この時点で .mmf ができる。
SCP-MA-N-110-j.zip を解凍してインストール。Bin/SCP-MAX.exe を起動。.mmf をウインドウにD&D。これで .mld が出力された。
出力された .mld を MidRadio Player に D&D。鳴ってくれた。… MidRadio Player は、YAMAHA製音源チップの音色を持ったソフトウェアMIDI音源を内蔵してるらしいので、たぶん実機の音色に近いところもあるのであろうとほんのり期待。 *1
ちょっと気になるのは、SCP-MA-N-110-j.txt に、以下のような注意書きがあったこと。
mld_NにおいてはMA-3とMA-5を使用した端末それぞれでベロシティーカーブが違ったり、WTの音圧調整方法が違うため、同じMA音源を使っていても音量に差がある場合があります。N505ではちゃんと鳴らせない可能性があるのか。うーむ。
SMAFから変換したデータをそのまま再生できる端末は以下になります。
- SMAF/MA-2 -> N503
- SMAF/MA-3 -> N504,N251
- SMAF/MA-3 -> N2051(FOMA),海外向けMA-3端末
この変換は、SCPのオプションにつけたVelocity変換機能を使用した際に対応します。
- SMAF/MA-5 -> N900,N506
★SMAF/MA5 -> N505,N252(MA-5)
SMAF-MA5を変換したmldは、N505,N252で再生した場合、本来の音量バランスとは違った鳴りになる場合があります。
MA5_AT の、ATS-MA5-N-D230-j/MA音量バランスについて-ATS.pdf を覗いたら関連記述が。
2.1 WT,STREAM +12dB シフトについてなるほど、N50x は一部に関してMA-3的であると…。
MA-3 とMA-5 で音量の設定が違います。MA シリーズではFM 発音とWT 発音の聴感上の音圧レベルをそろえる目的から、FM に対してWT とSTREAM の音量が+12dB 上がるようになっています。MA-3 ではHW 的なアシストが無い事もあって、(MasterVolume + Velocity で+12dB)を1つの音量設定HW で処理するようになっています。HW 的に0dB を超える設定は出来ないため、(MasterVolume + Velocity)が(-12dB)を超える場合は音量がそれ以上は上がらず飽和します。Velocity のカーブは20 Log(x / 127)です。これに対し、MA-5 ではHW 的にWT とSTREAM の音量を+12dB する様になっているので、Velocity 設定に対する制限はありません。Velocity のカーブは40 Log(x / 127)が基本です。
※但し,MA-5 端末の内 N505i,N505is,N252i についてはMA-3 方式
もう一つ気になるのは、ここで作った .mld は、N50x 以外でも鳴らせるのか判らないこと。YAMAHA サイトの、 _対応端末の情報ページ には、Nxxx しか書いてないわけで。他メーカの製品は、違った音源チップを乗せてるということなんだろうか。
どの機種でも共通で鳴らせるデータを作る方法を知りたいのだけど、もしかすると無理なのかしら。…なんとなくMSXを思い出してしまう。 *2
何にせよ、次はwavを変換できるか試してみないと。
◎ _SMAF / SMAFとは? / SMAF対応音源・端末情報 :
現在ヤマハでは、SMAFファイルの再生用に「MA-1」「MA-2」「MA-3」「MA-5」「MA-7」という5種類のLSIを製造しています。「MA-1」「MA-2」「MA-3」「MA-5」「MA-7」では、それぞれ高音質な最大4音、16音、40音、64音、128音を同時に演奏できます。現在、多数の携帯電話にヤマハの音源LSIが使用されています。
_ヤマハ音源LSI YMU765 『MA-5』
MA-5 は、高機能なゲームサウンドや高品位着信メロディなど、携帯電話端末で扱うサウンドの出力デバイスとして最適なLSI です。
MA-5 に搭載されている音源部は、FM音源、WaveTable音源、ストリーム音源、AL(Analog Lite)音源、HV(Humanoid Voice)音源と、5種類の音源方式を組みあわせた「ハイブリッド音源方式」を採用し、最大64音を同時に発音可能です。
シンセサイザやパソコン用マルチメディア音源などに幅広い実績のあるFM シンセサイザは、わずか数十バイトのパラメータ指定で無限の音色を表現できるため、メモリ容量や通信帯域を節約することができ、任意の音色付メロディの配信が可能になるなど、携帯電話端末の動作環境で特長を発揮します。さらに、FMシンセサイザは携帯電話の着信メロディとして最適な輪郭がはっきりとして、明瞭で、聞き取りやすい音の発音が可能です。FM音源ってことは、携帯も、メガドラ程度の効果音なら作れるはず、ということでありましょうか。…無理かな。 *3
◎ テストプログラムを作成。 :
_メディアリソースを利用して絵と音のあるiアプリ作成
を参考にしつつ。ていうかそのまんまコピペしてるに等しいか…。とりあえず、曲データに関しては、エミュレータ上で鳴ってくれた。
こんな感じ。
あ。考えてみたら、ScreenShotを載せたところで完全に意味がない種類のサンプルではないか…。まあ、いいや。
N505の機種依存情報、n505is_iappli_notes_1.pdf を眺めたら、複数の音を同時に鳴らす際に…このへんってこういう場所に書いちゃいけない情報だったっけか。pdfをコピペしようとしたらできなかったから、秘密にすべき情報とされてるのかもしれん。 _とりあえずNTTドコモのページ からDLできるけど。
こんな感じ。

あ。考えてみたら、ScreenShotを載せたところで完全に意味がない種類のサンプルではないか…。まあ、いいや。
/*
* サウンド再生テスト
*/
package soundtest;
import com.nttdocomo.io.ConnectionException;
import com.nttdocomo.ui.AudioPresenter;
import com.nttdocomo.ui.Canvas;
import com.nttdocomo.ui.Display;
import com.nttdocomo.ui.Frame;
import com.nttdocomo.ui.Graphics;
import com.nttdocomo.ui.IApplication;
import com.nttdocomo.ui.MediaManager;
import com.nttdocomo.ui.MediaSound;
import com.nttdocomo.ui.UIException;
public class SoundTest extends IApplication {
public void start() {
MediaCanvas m = new MediaCanvas();
m.setSoftLabel(Frame.SOFT_KEY_2, "終了");
Display.setCurrent(m);
}
}
class MediaCanvas extends Canvas implements Runnable {
// サウンドファイル名
static final String[] FILE_LIST = {
"pop02.mld", "stg_03.mld", "stg_10.mld", "up03.mld"
};
// サウンドの種類 0:SE / 1:BGM
static final byte[] SOUND_KIND_LIST = {
1, 1, 0, 0
};
// サウンドファイル個数
static final int SOUND_MAX = 4;
// frame per sec
static final int FPS = 100;
static final int SLEEP_VALUE = 1000 / FPS;
AudioPresenter[] audio = new AudioPresenter[SOUND_MAX];
int sound_num;
Thread tm;
int key;
int keyrel;
int keytrg;
boolean paint_fg;
// コンストラクタ
public MediaCanvas() {
paint_fg = false;
sound_num = 0;
key = 0;
for (int i = 0; i < SOUND_MAX; i++) {
audio[i] = AudioPresenter.getAudioPresenter(SOUND_KIND_LIST[i]);
audio[i].setSound(getResourceSound(FILE_LIST[i]));
}
tm = new Thread(this);
tm.start();
}
// メイン
public void run() {
paint_fg = true;
while (true) {
// メインループ
try {
Thread.sleep(SLEEP_VALUE);
} catch (InterruptedException e) {
break;
}
// キーの押し下げ情報を取得
int keyold = key;
key = this.getKeypadState();
keyrel = (keyold | key) ^ key;
keytrg = (keyold ^ key) & key;
if ((keytrg & (1 << Display.KEY_DOWN)) != 0) {
audio[sound_num].stop();
} else if ((keytrg & (1 << Display.KEY_UP)) != 0) {
audio[sound_num].play();
} else if ((keytrg & (1 << Display.KEY_LEFT)) != 0) {
sound_num--;
if (sound_num < 0) {
sound_num = SOUND_MAX - 1;
}
} else if ((keytrg & (1 << Display.KEY_RIGHT)) != 0) {
sound_num++;
if (sound_num >= SOUND_MAX) {
sound_num = 0;
}
}
repaint();
}
}
MediaSound getResourceSound(String resource) {
MediaSound sound = null;
try {
sound = MediaManager.getSound("resource:///" + resource);
sound.use();
} catch (ConnectionException ce) {
sound = null;
} catch (UIException e) {
sound = null;
}
return sound;
}
public void processEvent(int type, int param) {
if (type == Display.KEY_PRESSED_EVENT) {
if (param == Display.KEY_SOFT2) {
IApplication.getCurrentApp().terminate();
}
}
}
// 画面描画
public void paint(Graphics g) {
g.lock();
g.clearRect(0,0,getWidth(),getHeight());
if ( !paint_fg ) {
g.drawString("初期化中",32,32);
} else {
int x = 32;
int y = 32;
g.drawString("SOUND No. " + sound_num, x, y);
y += 12;
g.drawString("← →", x, y);
y += 12;
g.drawString("PLAY : ↑", x, y);
y += 12;
g.drawString("STOP : ↓", x, y);
}
g.unlock(true);
}
}
本当にこれでいいのか自信ないけど。既に鳴ってるサウンドと別のサウンドを差し替えて演奏するのはこれでいいのかしら。stop() 入れたほうが良かったりして?N505の機種依存情報、n505is_iappli_notes_1.pdf を眺めたら、複数の音を同時に鳴らす際に…このへんってこういう場所に書いちゃいけない情報だったっけか。pdfをコピペしようとしたらできなかったから、秘密にすべき情報とされてるのかもしれん。 _とりあえずNTTドコモのページ からDLできるけど。
◎ フリーのMIDIデータを、.mid → .mmf → .mld 変換・再生テストに使わせてもらった。 :
以下のサイトから。
_Aquanote -ゲーム向きのフリーのMIDI素材を公開-
_COMA WHITE
_COMA WHITE 【 FREE MIDI DATA 】
利用に制限を設けてないのがありがたい。感謝なのであります。
_Aquanote -ゲーム向きのフリーのMIDI素材を公開-
_COMA WHITE
_COMA WHITE 【 FREE MIDI DATA 】
利用に制限を設けてないのがありがたい。感謝なのであります。
*1: MidRadio Player については
_2005/12/25の日記
を参照。
*2: いや、MSXは触ったこと無いんですが。機種依存部分があるとかないとか聞いた記憶も。RAM容量がどうとか。
*3: メガドラだって、サブCPU Z80 が音源を細かく制御してたからあのぐらいの音を出せていたはず。…でも、今は音源チップ自体がそこまでやってくれたり、するのかなぁ。
*2: いや、MSXは触ったこと無いんですが。機種依存部分があるとかないとか聞いた記憶も。RAM容量がどうとか。
*3: メガドラだって、サブCPU Z80 が音源を細かく制御してたからあのぐらいの音を出せていたはず。…でも、今は音源チップ自体がそこまでやってくれたり、するのかなぁ。
[ ツッコむ ]
以上です。