home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 3
/
FreeSoftwareCollection3pd199x-jp.img
/
oh_fm
/
reverse
/
reverse.txt
< prev
Wrap
Text File
|
1980-01-02
|
7KB
|
133 lines
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
逆再生エフェクタ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
プログラム名:REVERSE.BAS (F-BASIC386によるメインル-チン)
REVERSE.REX (F-BASIC386用マシン語サブル-チン)
REVERSE.ASM (F-BASIC386用マシン語サブル-チンソ-ス)
対応機種 :FM TOWNS
作者 :EAST
●口上
PCMサウンドデータ加工法の基本には何も難しいところはありません。ここでは,
PCMサウンドのいじり方の例として, マイクに向かってしゃべった声をすぐさま後
ろから逆に再生するプログラムを紹介します。 ぜひ,皆さんも音いじりの楽しさを味
わってみてください。なお, プログラムは◎h!FM'90年6月号に掲載されたもので,
作者のEAST氏および◎h!FM編集部のご好意により収録しています。
●逆再生って?
音声の加工といえばまずまっ先に出るのがこの逆再生でしょう。逆再生の古典的な
遊び方に,しゃべりたいことをローマ字で書いておいてそれを逆に読んだものを逆再
生すると正しく聞こえる,というものがあります。たとえば「タウンズ」なら(日本
語読みするとだけど)「TAUNZU」ですから「UZNUAT」という感じで読めば「タウンズ」
と聞こえるはずです(子音だけの音は日本語にはないですが,そこはそれ,そういう
感じで読んでください)。あと,適当な言葉を逆再生させて,なんて言っているか当
てる,というゲームもなんともありがちな感じですが,人数が多いとこれがけっこう
受けるものです。
テープでは逆再生は簡単ですね。そう,テープを逆に回せばいいのです。じつは,
PCMデータでも簡単に逆再生は可能です。PCMデータとは音量の大きさを数値に
変えたものを時間順に並べただけのものなので,これを逆の順番に並べ換えるだけで
いいのです(当然, .SNDデータ形式では始めに32バイトのヘッダが付いているの
でここはそのままにしておかないといけませんが)。うーむ,簡単の極みですね,BA
SICでもすぐにできてしまうでしょう。 それだけでは話にならないので,マシン語で
サブルーチンを組んでみました。簡単とはいっても,たとえF-BASIC386でも数十
~数百Kバイトの音声データを並べ換えるとなるとかなり時間がかかってしまいます
が,マシン語だとまさに一瞬で並べ換えてくれます。
●.SNDファイルの構造は?
PCMデータを使うとなると, 先ずは.SNDのことをよく知らないといけません
ね。 .SNDデータのフォーマットですが, 基本的には32バイトのヘッダとPCMデ
ータによってできています。それでは一つひとつのパラメ-タの意味を説明していき
ましょう。
+ 0:8バイト:サウンドネーム
これはサウンドの名前です。8文字までの文字で表します。
+ 8:4バイト:サウンドID
これはサウンドBIOSが.SNDデータを扱うときに使うものです。サウンドデ
ータを新規に作るときは乱数を入れておいてください。
+12:4バイト:データ幅
サンプリングデータの大きさです。これは純粋にサンプリングデータの大きさで,
ヘッダの大きさ(32バイト)は含まれません。
+16:4バイト:ループポイント
ループを開始する位置です。ループというのは,限られたメモリーを有効に使うた
めの方法で,ループで指定された範囲のサンプリングデータを繰り返して再生します。
こうすると少ないデータで長い音が出せます。当然,時間がたつと繰り返しの音しか
出ませんので,そのへんを考えて使わないといけません(人混みの雑踏の音などはこ
れを使ってもあまり繰り返しは目立ちません)。
+20:4バイト:ループレングス
ループの長さです。ループポイントとセットで使います。 ループレングスを0にす
るとループしません。
+24:2バイト:サンプリング周波数
サンプリングしたときのサンプリング周波数です。実はここに書かれた値はHz単
位でのサンプリング周波数ではありません。実際に書き込む値はサンプリング周波数
(KHz)を62h倍した値となります。 62h=98ですから約10.2Hz単位で指定できる
ことになります。 音がずれるんじゃないか,と心配の方もあるかと思いますが16.01
KHzでサンプリングしてもどうせ0.001%以下のずれです。心配はいらないでしょう。
+26:2バイト:原音の補正値
サンプリングした音が正確な音程でないときにこの値をサンプリング周波数に加え
て補正することができます。ただし補正は半音以内にしてください。補正がいらない
ときは0にします。
+28:1バイト:原音の音階
再生される音階をあらわします。PCM音源の楽器データ(.PMB)に変換すると
きはMMLでいうところの「O4C」の音階でサンプリングしてください。音声データ
(.SND)の場合は普通,60を書いておきます。
+29:1バイト:フラグ
今のところ使われていませんが,予約されています。0にしておいてください。
+30:2バイト:予約済
ここも予約済。0にしてください。
ここまでがヘッダの内容です。+32から本当のPCMデータが入っています。PC
Mデータは量子化数(すなわち音量レベルの分解能)が8ビットですから,当然1バイ
ト単位で入っています。TOWNSのPCMデータではこの1バイトの解釈が普通の符号付
の1バイトの整数とは違います。 どう違うかと言うと「最上位ビットが正負を表す符
号ビットで,後の7バイトで絶対値を表す」ということになっているからです。 普通
なら02hは2,FEhは-2を表していますが,PCMデータは2は82h,-2が02hとなりま
す。
また,00hとFFhはそれぞれ,ヌル(無効),ループストップデータ(これが来る
とループ開始点にジャンプする)として使われているので,実際に使えるのは-127か
ら+126までです。ついでにいうと0は80hになります。
ここまでわかれば後はどんどん.SNDデータがいじれるはずです。 まあ,普通は
配列に.SNDデータを入れて,PEEK,POKEを使えばいいでしょう。
●使い方
それではプログラムです。REVERSE.BASが逆再生のサンプルのBASICのリストで,
REVERSE.REXがマシン語ルーチンです。この2つをワ-クディスクにコピ-してくださ
い。 したディスクをカレントドライブに入れておいてください。そして,F-BASIC386
(L20以降)を立ち上げて,REVERSE.BASを読み込んで実行してください。マシン語ルー
チンをプログラムが読み込んだら,マイクに向かってなにかしゃべってみてください。
たとえば「あいうえお」としゃべるとしばらくして「おえういあ」とスピーカーから
音が出るはずです。普通しゃべるときは,音の出始めが音量が大きく,それから段々
と小さくなるのですが,それが逆になるので音がもわもわという感じで聞こえるでし
ょう。
●応用法について
このサンプルではマイクから音を取り込んでそれを逆に並べ換えて再生しています
が,ファイルから .SNDデータを読み込んで,またファイルに書き込むようにして
もいいですね。要はCLEAR文で,マシン語の領域を確保してリスト2のマシン語ルーチ
ンを読み込み,逆再生したい.SNDデータが入った配列のアドレスを引き数としてC
ALLMで実行させればいいのです。 .SNDデータのヘッダの中の情報を読んでPCM
データの長さを調べているので配列の大きさを渡す必要はありません。あまり簡単で
申しわけないのですが,ソースをREVERSE.ASMに載せておきます。.SNDデータをい
じるサブルーチンをマシン語で作るときの参考にしてください。
●終わりに
PCMデータは,このようにたいへん加工がしやすいのでアイデア次第でいろんな
事ができると思います。 8ビットの分解能で19.2KHzのサンプリング周波数がある
のですから,けっこう聞ける音が出ますからね。みんなでどんどん変な音を作りまし
ょう(何か違う……)。
● 著作権・再配布について
このプログラムの著作権は作者が保持しておりますが,著作権法の定める「個人的
な利用」の範疇であれば自由に利用してくださってけっこうです。また,転載・配布
についても事前の許諾なしに自由に行ってくださってかまいません。ただし配布時に,
1. 「EAST」がプログラミングしたものであること
2. Oh!FM'90年6月号に掲載されたものであること
3. 作者の自由転載許可に基づいて転載・配布したものであること
の旨を,説明用のテキストに明記してください。