SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|

2022-09-10(Sat) 結局、効果音生成ツールを自作する

  先日、ノイズを生成できるようになってから、効果音生成プログラムに組み込んでアレコレしていたのだが、アレコレしているうち、効果音とは、基本となる波形に様々な変化を繰り返し重ねていくことによって生成するものだということがわかってきた。

  主には、正弦波、矩形波などの生成、加算、変調、音量変化などである。しかし、その方法を汎化して記述するにはどうすればいいのか。そもそも変調とは何なのか。

  考えれば考えるほどわからなくなり、コードを書いては試し、何度も書き直した。コードの追加ではなく、こんなに何度も、構造ごと変えては、頭から書き直したのは初めてだ。変調を追求していくうちに、FM音源に行き当たり、周波数変調、位相変調、YM2151(OPM)の仕組みにまで踏み込んでしまい、オペレータのコネクションを再現するために、RPNっぽい手法まで実装することになった。

  結局、ほぼ、シンセサイザを自作した、というレベルではないだろうか。ヤクの毛刈りどころか、3頭はバーベキューにして食い尽くした気分だ。

  最終的には、以下のような記述で音を作る。以下は、soxのサンプルにあるパイプオルガンによるAm7を再現するもの。typeで正弦波(sine)を指定、freqで周波数(A3, C4, E4, G4)を指定、envでエンベロープ(音量変化)を指定。最後にそれらをRPN記法で重ねていく。

 @length = 1
 
 car1 = it = {}
 it[:device] = 'generate'
 it[:length] = @length
 it[:type] = 'sine'
 it[:freq] = <<FREQ
 #+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A
 #--1----(55)1--2---(110)2--3---(220)3--4---(440)4--5---(880)5--6--(1760)6--7--(3520)7--8--(7040)8
 ..................................../
 FREQ
 it[:amp] = <<AMP
 #--------------25--------------50--------------75-------------100
 ................/
 AMP
 
 car2 = it = {}
 <略、C4 の正弦波>
 
 car3 = it = {}
 <略、E4 の正弦波>
 
 car4 = it = {}
 <略、G4 の正弦波>
 
 add = it = {}
 it[:device] = 'add'
 
 env1 = it = {}
 it[:device] = 'env'
 it[:length] = @length
 it[:amp] = <<AMP
 #--------------25--------------50--------------75-------------100
 /
 ................................................................/
 ................................................................/
 ................................................................/
 ................................................................/
 ................................................................/
 /
 AMP
 
 @connection = [ car1, car2, add, car3, add, car4, add, env1 ]

  これでwavファイルが生成される<聴いてみる>。

  もちろん、加算はもっとも基本的な演算で、真骨頂は変調である。インベーダのUFOの音っぽいの<聴いてみる>とか、パックマンのモンスタの音っぽいの<聴いてみる>とか、R-TYPEのショット音っぽいの<聴いてみる>とか、ダライアスのレーザ音っぽいの<聴いてみる>とか、割と直感的な記述により生成することができる。

  今回、FM音源のことを調べていて、ものすごく少ないパラメータ(バイト数)で音色が作れることが、当時のPCの性能事情に即していたこと。反面、音色作りがものすごく難しかったことを、改めて知った。実際、自分もX1のFM音源をアレコレしていたが、ちっともイメージしたような音色が作れなかった。

  とはいえ、アレよりはだいぶマシだと思うが、このツールでもイメージ通りの音に近づけていくのは難しい。近づけようとしても、意外な音ができて、その音が気に入ってしまったりする。ま、それはそれでいいんだが。


2022-09-12(Mon) 結局、効果音生成ツールを改良する

  一応、効果音生成ツールは一応の完成を見たのだが、やりだすと、そう簡単には止まらないのである。

  ゲームの効果音にノイズは欠かせない。そのため、ホワイトノイズ、ブラウンノイズ、ピンクノイズ、パープルノイズが使えるようになっているが、それだけでは足りなすぎるのである。バリエーションが欲しい。

  で、ノイズに音程があるかというと、微妙である。ノイズを音程に分解すると、その分布によって上記の「色」が決まるのだが、それなりに広く分布しているので、ノイズには音程がないと言える。

  んが、一方で、3,8,5というノイズを、3,3,8,8,5,5と加工すれば、低音側に遷移することに疑いはないのである。まぁ、厳密な定義はともかく、指定の方法はトーンに合わせて、440.0を標準とし、詰めたり、間引いたりすることで、ノイズに音程変化が起こせるようにしてみた。

  なんだかんだコードを書いているうち、不具合があることに気付き、割と大きな追加/修正になってしまったが、表現力が大きく上がった気がする。

 @length = 1.0
 
 mod1 = it = {}
 it[:device] = 'generate'
 it[:length] = @length
 it[:type] = 'square'
 it[:freq] = [8]
 it[:amp] = <<AMP
 #--------------25--------------50--------------75-------------100
 ................................................................/
 AMP
 
 noise1 = it = {}
 it[:device] = 'fm'
 it[:length] = @length
 it[:type] = 'pink_noise'
 it[:freq] = [20]
 it[:amp] = <<AMP
 #--------------25--------------50--------------75-------------100
 ................................................/
 ................................................................/
 /
 AMP
 it[:index] = 1.5
 
 @connection = [ mod1, noise1 ]

  こんな記述で、ロケット噴射音っぽいの<聴いてみる>を作ることができた。これは使えるな、そろそろシューティングの製作に戻ろう。


2022-09-29(Thu) ウォッチをウオッチ

  このブログでも何度取り上げているが、長らくナビホークというシチズンの航空腕時計を愛用している。前回は日記エントリにしなかったが、2020年9月に5度目の電池交換をしたところだ。購入日は1999年6月26日とあるので……え、23年も使ってんのか。

  しかし、最近は出勤しないので腕に巻く機会が激減している。カラオケの練習の時に3時間を計測したり、ジョギングしている時間を計測したり、どっちもストップウォッチとしての利用だな。

  が、ここ数ヶ月、右上のボタン、ストップウォッチのスタート、ストップに使うボタンが徐々に渋くなり、とうとう戻ってこなくなってしまった。えー、電池交換までまだ何年もあるし、それだけのためにメンテに出すのもなぁ。結構、お金が掛かるし……。

  ストップウォッチはあったほうがいいのだが、ストップウォッチもなぁ……というワケで、ちょっと見栄えのする安い腕時計を探すことにした。アリエクでいいかな。

  ところが、ちょっと見栄えのするのはアリエクでも2000円くらいする。信頼性の低いものにそんなに出すなら、カシオのがいいわ。というわけで、カシオで探す。G-SHOCKにコダわりはないが、アナログが好きなので、ストップウォッチ付きとなると、ほぼアナデジコンビタイプに絞られる。

  ゴチャっとしているのもイヤじゃないが、針の視認性が低いのはイヤである。黒地に白は悪くないが、液晶部分が灰色だと浮いている感じで違和感。ナビホークは全体に灰色地なのでよかったのだが……と、最近は液晶部分が反転しているものもある。液晶表示は見やすいとはいえないが、デザインとしては悪くない。

  画像の説明 画像の説明

  と、結局、散々に迷った挙げ句、AEQ-110W-1BJHという製品にした。4230円。地味だが、パッと見G-SHOCKで、それほど安っぽくは見えない、と思う。

  最後まで迷った製品は、似たような感じでソーラー稼働だったのだが、ストップウォッチが1時間までという制約と、ソーラーも充電池の交換が必要な場合があると聞いたことがあるので外した。

  画像の説明

  で、26日に届き、フムン、実物も悪くないな、と思っていたところで、偶然にG-SHOCKの新作に関するニュースを目にした。値段は5倍くらいするが、なんだか、デザインコンセプトがすごく似ている気がするな。