パンデミック後の新世界を作るために (foussin’s blog)

(『見捨てられた世代』からの提言)

エンジン音をシミュレートする MSX-BASIC コード

 今回は、sound文を使って「エンジン音」をシミュレートするサンプル・コードを掲載。できれば実行中の動画や音なども見せたい・聴かせたいところだが、MTRもカメラも、金目の物は全部売ってしまった。さらに自分の Windows マシンが故障中なので動画編集も無理。

 コードを書いたのは2年前(2019.3月)。急に物理学や量子論への興味が湧いてきて、「距離の2乗」の意味に気が付いたのも、ちょうどその頃だった。デフォルトで sound文を実装している BASIC は、気軽に音を出すには便利な言語だった。

10 'idoling sound -> jet engine マデ
20 'ト-ン シュウハスウ(12bit) デ シミュレ-ト
30 '(MSX2+ ヒョウジュン・モ-ド)
40 '2019.3.16sat - 2019.3.17sun
50 :
70 '     12345678
80 'save"tone-jet.bas",a
90 :
100 'init
110 FC=1789772.5# 'fclock(MSX ノ バアイ)
120 CLS:SOUND8,0:SOUND9,0:SOUND10,0
130 SOUND 7,&B100100 'noiseAB,toneAB
140 SOUND 6,10:SOUND 8,13:SOUND 9,11
150 :
160 PRINT"180-1680rpm(アイドリング サウンド?)"
170 Y=CSRLIN:RP$="####rpm":HZ$="(##Hz)"
180 CT$=" R1(CT):###" '28Hz ミマンハ ダメ?
190 FT$=" R0(FT):###" '(R1:ナンデ 3ケタ?)
200 FOR I=180 TO 1680 STEP 30
210  GOSUB 790      'noise,tone sub:
220  GOSUB 710      'print sub:
230 NEXT I
240 GOSUB 980       'ジカンマチ sub:
250 :
260 PRINT"1680-7200rpm(プロペラ エンジン)"
270 Y=CSRLIN:CT$=" R1(CT):##"
280          FT$=" R0(FT):###"
290 RP$="####rpm":HZ$="(###Hz)"
300 FOR I=1680 TO 7200 STEP 120
310  GOSUB 790      'noise,tone sub:
320  GOSUB 710      'print sub:
330 NEXT I
340 GOSUB 980       'ジカンマチ sub:
350 :
360 PRINT"7200-19200rpm(F1 サウンド)"
370 Y=CSRLIN:CT$=" R1(CT):#"
380          FT$=" R0(FT):###"
390 RP$="#####rpm":HZ$="(###Hz)"
400 FOR I=7200 TO 19200 STEP 300
410  GOSUB 790      'noise,tone sub:
420  GOSUB 710      'print sub:
430 NEXT I
440 GOSUB 980       'ジカンマチ sub:
450 :
460 PRINT"19200-84000rpm(グラインダ-?)"
470 Y=CSRLIN:CT$=" R1(CT):#"
480          FT$=" R0(FT):###"
490 RP$="#####rpm":HZ$="(####Hz)"
500 FOR I=19200 TO 84000! STEP 1200
510  GOSUB 790   'noise,tone sub:
520  GOSUB 710   'print sub:
530 NEXT I
540 GOSUB 980    'ジカンマチ sub:
550 :
560 PRINT"80000-320000rpm(JET エンジン)"
570 '80000rpm(1333Hz),320000rpm(5333Hz)
580 Y=CSRLIN:CT$=" R1(CT):#"
590          FT$=" R0(FT):##"
600 RP$="######rpm":HZ$="(####Hz)"
610 FOR I=80000! TO 320000! STEP 2000
620  GOSUB 790   'noise,tone sub:
630  GOSUB 710   'print sub:
640 NEXT I
650 GOSUB 980    'ジカンマチ sub:
660 :
670 SOUND 7,&B111000 '=56
680 SOUND 8,0:SOUND 9,0:SOUND10,0
690 END
700 :
710 'print sub:***********************
720 LOCATE 0,Y
730 PRINTUSING RP$;I;
740 PRINTUSING HZ$;INT(FE+.5);
750 PRINTUSING CT$;CT;
760 PRINTUSING FT$;FT
770 RETURN
780 :
790 'toneAB sub:**********************
800 'ト-ン シュウハスウ(12bit:2^12=4096)
810 '    CT(4bit:0-15) FT(8bit:0-255)
820 '    FE ユウコウ ハンイ:27.5Hz - 20kHz(?)
830 '    (27.5Hz ハ オンカイ "o0A" ニ ガイトウ)
840 '    (チャント キコエルノハ 5000Hz グライ マデ)
850 FE=I/60:IF FE<28 THEN FE=28:I=1680
860 TA=FC/(16*FE)       'ch-A
870 CT=INT(TA/256)      '4bit
880 FT=INT(TA-(CT*256)) '8bit
890   TB=FC/(16*(I-20)/60)   'ch-B
900   IF FE>20000! THEN TB=TA'ユニゾン
910   C4=INT(TB/256)         '4bit
920   F8=INT(TB-(C4*256))    '8bit
930 SOUND 1,CT:SOUND 0,FT 'ch-A
940 SOUND 3,C4:SOUND 2,F8 'ch-B
950 RETURN
960 :
970 'ジカンマチ sub:**********************
980 FOR T=0 TO 1500:NEXTT:PRINT:RETURN

 これを MSX実機で run すれば、想像以上のクオリティでエンジン音が再現できる事に驚くと思う。残念だが、MSXエミュレータでは期待外れの音しか出ないと思う。
 普通の BASIC なので、110行の FC(fclock) を変えれば MSX 以外の機種でも実行できると思う(NEC PC-9801 とか)。fclock というのは、CPU PSG のクロック周波数の事だ。補足追記:PSGとは、プログラマブルサウンド・ジェネレータの略で、音声出力専用のLSI(集積回路)である。

 このコードが教えてくれるのは、エンジン回転数(rpm)と周波数(Hz)が、単純な比例関係になっている事。つまり、エンジン周波数(音の高さ)が分かれば、自動的にエンジン回転数も予測可能だ。ま、rpm/60 = Hz なので当然の話。

 ソースに書いてあるとおり、アイドリング時の低速回転からジェットエンジンの音まで再現している。具体的には…

160 PRINT"180-1680rpm(アイドリング サウンド?)"
 180rpm ではエンストしそうだが、大型バイクなら、案外こんなものだった気がしている。1回転辺りの爆発力が大きいのでエンストしない。大型バイク特有のゆっくりした「ドッドッドッド…」という振動音は迫力がある。

260 PRINT"1680-7200rpm(プロペラ エンジン)"
 最近、「荒野のコトブキ飛行隊」というアニメを観た。水平飛行中のレシプロ戦闘機は、エンジン音から推測すればこの辺りの回転数と思われる。普通自動車と大して変わらないので意外だが、排気量(馬力)が違うし、路面との摩擦がない分、案外こんなものかもしれない。
 このコードでは、A,B 2チャンネルを使ってユニゾンで音声出力してるので、多気筒エンジンっぽさが出ていて、さらに「いい感じの音」になった。

360 PRINT"7200-19200rpm(F1 サウンド)"
 昔の「F1・ホンダ・サウンド」が青天を突き抜けるような「ええ感じの音」だったのは、他メーカーのエンジンよりも回転数が上だったに違いない(2万回転ぐらい?)。時代的にはジェンソン・バトンの頃だったかな。
 今はレギュレーションが厳しくなっているので、あのサウンドはもう聴けないと思う。今やモータースポーツも脱炭素の時代なので。

460 PRINT"19200-84000rpm(グラインダ-?)"
 ソースにはグラインダーと書いたが、歯医者が歯を削る時の「チュイーーン」という、あの音の方が似てると思う。

560 PRINT"80000-320000rpm(JET エンジン)"
 いわゆる「キィーーーン」という、あの音。10万rpm ぐらいになると、あんな音になる。ソースでは 32万rpm=5333Hz までループさせているが、年寄りには聞こえにくいモスキート音レベルの高周波だ。ジェットエンジンがどんだけ燃料使ってるかが想像できる。


 今回はここまで。距離に比例して音が小さくなるとか、ドップラー効果のコードは次回に紹介する(長文になりそう…)。
 また緊急事態宣言が出るようだ。そうなったら、当分の間はネットカフェへ来られなくなると思う。次回の投稿を急ごう。。。