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

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

今こそ民主主義のスポークスマンが必要…

 今の日本は、新型コロナの感染拡大に歯止めが効かなくなっている。ウィルスの問題では「責任を擦り付けられる悪人」はどこにも居ない。つまりこれは、社会全体で対処する問題である。

 特定の業界のみに痛みを押し付けるのではなく「社会全体で痛み分け」にすべき問題である。

 日本は諸外国と比べれば、強権的なロックダウンもせず、割と民主的に感染対策に取り組んできたと思う。が、その一方で、飲食店・サービス業・医療機関・官僚などに痛みを押し付けてきた。その歪みが今、軋み始めていて、その結果として感染拡大に歯止めが効かなくなっていると捉えるべきだ。

 それを変異ウィルスのせいにすべきではない。ウィルスの蔓延を放置・長期化させた事が、結果的に世界中で変異ウィルスを発生させた直接原因である事を認めるしかない。
 もちろんそれは日本だけのせいではないが、世界が自国第1主義に走る中、結局何もしなかったのは事実なので、黙って現状を受け入れるしかないだろう。

 最近やたらと「これをビジネス・チャンスと捉えて…」などという意見を聞くが、ちゃんと考えれば、それは他人の不幸に付け込んだ金儲けに過ぎない事は明白だ。行き過ぎた資本主義がモラルを麻痺させている現実に気付くべきだ。

 今の我々に必要なものは「ニュー・ノーマル」ではない。従来の理不尽・不公平を持ち越さない「新世界(ニュー・ワールド)」の建設こそ、必須案件ではなかろうか。ニュー・ノーマルは、その後で自然についてくるものである。

 だが、いつまで経っても新世界の実像が見えてこないのは、あらゆるシーンで民主主義を欠如させたまま、強引に事を運ぼうとするからだ。なぜそうなるかと言うと、資本主義の囲い込みが民主主義の実像を隠してしまうからだ。

 例えば、民主主義の思想を書籍というパッケージに閉じ込めて…

「金を払ってくれた人にだけ特別に教えてあげる」

…などという囲い込みを行うのは、民主主義の理念に反している。民主主義が、資本主義によって囲い込まれる事は、絶対にあってはならない。基本的人権によって保証される「民主主義の思想」は、常に開かれていなければならないからだ。
 つまり、民主主義は「オープンソース」でなければならない。自分が「民主主義ファースト、資本セカンド」を提言するのもこのためだ。

 たぶん多くの作家や思想家、報道メディア等が、このジレンマで悩んできた筈だ。民主主義をテーマとした書籍や放送番組で金儲けをする事に「後ろめたさ」を感じる者は多いと思う。だが、そうなると、民主主義の伝道者は「生活費を得る手段」を何に求めるべきか…

 それに対する自分の結論は「寄付を乞う」だった。スポンサーや雇用者の経済的圧力に屈する事無く、一切忖度せずに正しい事を発信し続けるためには、資本主義とは一定の距離を保って付き合う必要がある。
 本ブログを公開した時点で、自分は「資本主義に貢献する仕事」は、もうしないと宣言したも同然だ。今後の自分は、民主主義に貢献する作品を作る「表現者」として生き、そして死ぬつもりでいる。


教育格差・情報格差の解消こそ、信用回復の特効薬…

 専門家と一般人とでは、圧倒的な教育格差・情報格差が存在する。で、難解な専門用語で説明されても「何を言ってるのか、さっぱり理解できない」ので、一般人としては一般用語での説明を望んでいる。
 説明責任(アカウンタビリティ)とはそういう事だ。そうしてくれないと「わざと難しい言い回しをして俺たちを欺いているんじゃないのか?」…みたいな不信感が芽生えてしまう。

 例えば、熱狂的なトランプ支持者の深層心理には、金融工学などを駆使して莫大な利益を独占する「インテリ層に対する不信感」があると自分は考えている。しかも、そのインテリ層の多くが「民主党支持者」な訳だ。
 米国での分断の構造は、我々日本人が考えている以上に根深いと言える。また、その熱狂に便乗する「白人至上主義者」なども居るので、さらに話をヤヤコシくしている。

 ただ、こういう分断も、よく考えれば起こるべくして起きたとも言える。なぜなら、資本主義は「価値観の単純化」を推奨し、それによって「効率化を達成」するため、資本主義の下で働く市民も単純な価値観で物事を考えるようになるからだ。
 要するに「資本主義の利己的合理性」とは、弱肉強食で・早い者勝ちで・初めから持ってる者が有利で・ズル賢い「単純明快な世界観」で成立するので、特に社会の底辺にいる人は余計に頭を使わなくなるのだ。

 「奪ったり奪われたりする生活に、やっと順応したのに、何でそのルールを今さら変えるんだ。ヒドイじゃないか!」…という不満が爆発し、民主主義に敵意を向ける訳。
 自分に不利益を与える奴は撃っちゃえばいい、と短絡志向で行動する訳。米国人がいつまで経っても銃を手放せないのは、そういう社会背景もあると自分は考えている。

 最近、中国大使が米国の民主主義を批判するツイッターを投稿しているそうだが、米国や西側諸国で紛争や分断をもたらしたのは民主主義のせいではない。資本主義の方である。資本主義が他国を食い物にするから紛争が絶えないのだ。
 しかし社会主義だって、資本主義を批判できる立場ではない。全体主義も「価値観の単純化」を強制してくるからだ。効率化には必ず「単純化」という要素が絡んでくる。その点においては全体主義と資本主義は同じである。

 で、そういう不満や不信感を払拭するには、難解な事象を分かり易く言語化できる「能弁なスポークスマン」が必要だ。

 20年ぐらい前までは、宗教界に「ヨハネ・パウロ2世」と「ダライラマ14世」という2人のスポークスマンが居た。彼らは宗教者であると同時に民主主義の能弁なスポークスマンでもあった。
 今までの宗教者は、主のお告げを重々しく伝える「預言者」を演じてきたが、上記の2人は宗教者にしては非常に活動的で能弁だった。

 宗教や哲学、政治経済、最先端科学などは、一般人には難しい話題だ。だからこそ、今こそ能弁なスポークスマンが必要だと感じている。
 で、自分もその一翼を担いたいと思って本ブログを書き始めた。自分は「客観的表現力」なら割と自信がある。が、残念ながら自分にはカリスマ性がない。だから自分は、代わりに「平成不況」で培った知恵を出す。平成不況と今のコロナ禍には共通点があるからだ。

 残念だが、自分には弱者を救える力は無い。自分自身も少数派の弱者だからだ。なので、これを読んでくれた誰かが声を挙げてくれる事を強く望んでいる。今、一番大事な事は、大衆の中に埋没しない「自我と理念を持った人間」の発言であり、それによって大きな「世界世論」を形成する事だ。

重力には引力しかないのに電磁気力には引力と斥力がある理由【重力篇】

f:id:foussin:20161028001309p:plain
縦波(疎密波)のイメージ?

 上記は、過去の自分の「はてなフォトライフ」画像に、縦波っぽいイメージがあったので、それをちょっと引っ張り出してみた。正確な「疎密波」の図ではないけどね。今回も前回同様、縦波と重力波を関連付けた持論を書いてみる。


(思考実験:2021/04/29thu ~ 2021/05/02sun)

 ここまで、「距離の2乗」を発端として、横波は平面空間(2次元)に作用する波、縦波は立体空間(3次元)に作用する波だという仮説を立ててみた。
 その仮説に基づき「4つの力」が、それぞれが作用する次元の違い(1~3次元)により、それが力の強弱の違いとして表れる、という持論を展開してみた。
 さらに、荷電粒子から放射される光子の量と放射間隔が、それぞれ電磁波の「振幅」と「波長」の起源であるという持論も晒してみた。

 ここまでは、我ながら上手く言語化できたと思っているが、問題はその先だ。重力には引力しか働かないのに電磁気力には引力と斥力がある事。
 その電磁気力には電気力(+-)と磁力(SN)の2種類がある事。その電気力は正電荷負電荷の粒子に分けられるのに、磁力は個別の粒子を持たない事。
 さらに「電荷を持たない光子」と「電場・磁場」の関係をどう説明すればいい?…と、考えれば考えるほど謎だらけな訳。

 これらを説明するには、素粒子(光子・重力子)と空間だけに注目していては駄目で、荷電粒子(物質)もエネルギー実体であると常に認識してかからないと、思考が迷子に陥る。
 まず、重力波は物質から重力子(グラビトン)が放射される事で生まれ、電磁波は物質から光子(フォトン)が放射される事で生まれる。光子も重力子もエネルギー実体なので、それを放射する「物質もエネルギー実体」である。

 そして、2つの荷電粒子が「電荷を持たない光子をやり取り」する事で、ある時は引力が働き、ある時は斥力が働くという仕組みについては、昔、物理の教科書に掲載されていた「等電位面の図」と「定常波の性質」を使って説明できそうな気がしている。
 ただ、個人的には「光子のやり取り」という表現は不正確であり、誤解の元になっていると自分は考えている。


 とりあえず、重力には引力しかないのに電磁気力には引力と斥力がある理由を、今回は重力に絞って考えてみる。まず、この問題を単純に整理する…

重力には1種類の力しかないが、電磁気力には2種類の力がある

…と単純化して考える。これは「重力が縦波・電磁気力が横波」という自分の仮説を使えば、割と自然に説明できる。重力が縦波で伝わると仮定すると、次のように説明できる。

 縦波というのは、空間に詰まった粒子を「玉突き」しながら伝わる。これを「疎密波」という。で、疎密波の始まりは「常に密から始まる」と予想できる。玉突きで伝わる疎密波が疎の状態から始まるとは考えにくいだろう。

 この「常に同じ動作をする」という事が1種類の力しか生まない根拠になる。

 ただ、重力波が縦波だとすると、重力子(グラビトン)とヒッグス粒子が「等価のエネルギー実体」って事になってしまう。しかもヒッグス粒子は、静止もできて光速運動もできる粒子と規定する必要があるかも。そこが心配なところ…

 だが、ここで忘れてもらっては困るのは「波は空間が存在する限り無限に伝播する」という性質だ。つまり重力子が届いていない空間にも、重力波ヒッグス粒子を通じて伝播すると考える。
 要するに「重力の作用」においては、物質同士で重力子をやり取りする必然性はないのだ。そのため、グラビトンとヒッグス粒子が等価なエネルギー実体だったとしても、特に問題はないと考える(ヒッグス粒子の質量が 0 ならばの話だけど…)。

 さらに言えば、重力波には「波長・振動数」という概念はないと考えている。重力波の媒質は空間にビッシリ詰まった一定密度のヒッグス粒子と考える。
 で、重力を発生させている物質が、次の重力子を放射するには、目の前のヒッグス粒子が「疎の状態」になった時しか打ち出せないと考える。そうすると、波の伝わる速さは「光速に固定」されているため、重力波の振動数は常に一定にならざるを得ないと考える。

 要するに、重力波には固有の波長・振動数はあるが「それは常に不変」という性質を持つと考える。そこには、量子的な「空間の最小単位・時間の最小単位」も関わってくると考える。
 これは重力が、電磁波のように「明るさ(振幅)・色温度(波長)」といった多面性を持たない事を説明するための根拠として考えた訳。

 という訳で、重力波の強弱を決めるのは「放射される重力子の数」であり、その数は物質を構成する粒子の数(=質量)で決まってしまうと考える。それは波の振幅の強弱として現れる。そして、振幅の強弱は空間の歪み具合を表す。
 で、重力が「引力」という1種類の力しか持たない理由は、振幅で生じた歪みに物質が転がり落ちていくためと考える訳。

 縦波で生じた歪みに物質が転がり落ちるというのは、イメージが湧きにくいと思うが、3次元空間の歪みとは、ヒッグス粒子を押しのけるイメージを想像するのが分かり易い。
 ヒッグス粒子は物質の動きにくさを規定する「質量」に作用する粒子と考えられているので、ヒッグス粒子を押しのけた先に物質が転がり落ちる訳。その歪みに沿って物質が転がり、それが引力として現れる…これを説明するには、縦波の振動はとても都合がいいのだ。

 で、今までは縦波を「立体空間」に作用する波と表現してきたが、さらに詳しく言えば、重力の縦波は「3次元空間と3次元物質の質量に作用する波」と言い換える事ができる。これは納得できる落としどころに辿り着いたと思っている。

 まあ、個人的な持論に過ぎないんだけど… 今回はここまで。次回は電磁気力が引力と斥力を持つ理由を考える。

電磁波の「波長」と「振幅」を光子レベルで詳しく…

 本日は満月だった(旧暦十六夜)。あいにくの薄曇りだったが、薄い雲から透けて見える満月は妖艶な趣きがあった。。。

(思考実験:2021/04/25sun ~ 2021/04/27tue)

 今回のテーマは「光子」と「電磁波」に絞って考える。波全般の挙動を「一般化」するのは、もうちょっと先の課題としたい。

 以前、「距離の2乗」をテーマにした記事で、波の振幅を「素粒子の個数」が現れたもの…と書いた(個人的な仮説だが)。が、波長の説明はモヤッとした表現でお茶を濁した。

 でも、光子単体のエネルギーに違いがあるとは思えないのに、実際には「波長の違い」というエネルギー強度の違いがあるのは、よく考えれば不思議に感じる筈だ。今回はそれについて考える。
 が、それを説明するには予備知識がまだ不十分だ。そこで、特に重要な予備知識を仕込んでおきたい。

 波は「素粒子が空間に作用する事」で生まれる。そう考えると、波の波源は素粒子のエネルギーだ。電磁波の場合、光子が波源という事になる。しかし、1個の光子に「波の振幅と波長を決める個体差」があるとは、どうしても思えない。
 既に、波の振幅は「素粒子の数」で決まると自分は結論付けている。その時に紹介した図(俯瞰図)と、新たに作図した断面図を以下に示す。

【距離の2乗に比例して光が弱まる俯瞰図】

(光源)16    →|0 4 →|0 0 2|
  |     |  4  |  0 2|
  |     |44   |00  2|
  |     |     |    2|
  |     |     |2222 |

(pi * r^2)/4 = 4分の1円弧の面積の中を拡散
        しながら光子は進行する。

f:id:foussin:20210427195408p:plain
振幅の断面図.png
(編集環境が貧弱なので、曲線がイビツになってしまった…自分の Windowsマシンが復活すれば、こんなもの、自作 script-fu で簡単に作図できるのだが)

 つまり、電磁波の本当の波源は「光子の出発地点」の方だったと予想できる。それは、断面図の左端にある「物質(荷電粒子)」の事である。そこで今回の最初のテーマは…

光子はどこから来て、そしてどこへ行くのか。
…という話になる。


黒体輻射(黒体放射):

 光子は荷電粒子(物質)から放射され、荷電粒子に吸収される性質がある。特に電子と衝突し易いと考えられていて、それが宇宙の晴れ上がりの原因とされている。

 光子がエネルギ-の実体である事は誰も異論はないと思うが、その光子は荷電粒子(電子・陽子を含む物質)から放射される。つまり、荷電粒子自身も内部エネルギ-を持っている。「エネルギ-実体」は光子だけの専売特許ではなく、荷電粒子もエネルギ-実体といえる。

 自分の仮説では、荷電粒子は3次元空間のエネルギー実体で、光子は2次元空間のエネルギー実体と考えている。

 さて、荷電粒子とは、簡単に言えば「物質」の事。物質には必ず、電荷を持った「電子・陽子」が含まれるので物質は荷電粒子な訳。で、物質は常に光子を放射している。そのため、全ての物質は固有の熱を出している。これを黒体放射(黒体輻射)と呼ぶ。

 光子はエネルギー実体なので、物質が黒体放射を続けたら、いずれエネルギーを使い果たして物質は消滅するのでは? と思うだろうが、そうはならない。なぜなら、物質は黒体放射と同時にエネルギーの吸収も行っているから。

 むしろ、黒体放射は「外部からの刺激」の副作用だと自分は考えている。その、外部からの刺激こそ「ビッグバン」だと自分は考えている。宇宙には、ビッグバンのエネルギーが光子という形で充満していると考える。だから物質には、常に光子が供給され続ける。

 つまり、供給されたエネルギーが、そのまま黒体放射のエネルギーになっていると考える訳。で、物質自身にも内部エネルギーが存在しているので、そのエネルギーが吸収した光子を再び放射するエネルギーに転換し、黒体放射が実現するのだと解釈する。物質がエネルギーを「吸収しっ放し」ではいられないのは、そのためと考える。

 で、物質が吸収できるエネルギーには許容量があり、許容量を超えたエネルギーに当てられた物質は急激に発熱し、最終的に発火・融解・蒸発する。これは黒体放射の波長の変化として現れる。つまり、エネルギー収支のバランスが崩れた時に、波長は変化すると解釈できる。

 という訳で、光子は荷電粒子から放射される。光子には「荷電粒子という出発地点」がある事が理解できたと思う。これで発射地点(荷電粒子)と光子の相対的な位置関係が語れるようになった。これを波の「振幅」と「波長」を説明する土台とする(個人的な仮説だけど)。


仮説の結論:
電磁波の波長と振幅を決めるのは「黒体放射」のエネルギーだと解釈…

 自分が考えた結論はこうだ。波長の違いは「光子の発射間隔」が現れたもの…それしかない(と自分は考える)。発射間隔によって空間の振動数が決まる。それが波長として具現化されると考える。
 で、光子が等間隔で放射される理由は、時間という次元にも「量子的な最小単位がある」と仮定したからだ。つまり黒体放射は時計として使える。光子が放射される間隔は、放射元のエネルギーが大きいほど短くなる(早くなる)。

 それを「エネルギーを受け取る側」から見ると、エネルギーの授受間隔が短くなるから結果的にエネルギー強度が増す…となる。
 電磁波の振幅は光の明るさを表し、それは「同時に放射される光子の数」で決まるが、距離に応じて分散されるので次第に弱まる。一方、波長は放射間隔が短くなるほど「エネルギーが1点集中」されて届くので、力の分散が起きにくい。

 銃に例えれば「振幅は散弾銃」「波長はマシンガン」だ。つまり電磁波とは、散弾を連射するマシンガンなのだ。波長の違いを図で表すと次のようになる。

f:id:foussin:20210427195413p:plain
波長.png

 さて、光子が一定間隔で発射された場合、どの光子も常に光速で移動するので、個々の光子の間隔が途中で狭くなったり広がったりする事はあり得ない。空間に居る光子は減速も加速もできない。しかも止まれない。

 だからこそ、距離に関わらず「波長不変」なのだと考える。これは「複数の光子同士の相対速度は常に 0」である事を示している。が、これは光子の進行する向きが同一平面上の場合に限定されると自分は考えた。
 向きが同じ場合は、その光子群は「同一平面上に存在している」と解釈するのだ。自分が平面にこだわる理由は、電磁気力に由来する光子の運動範囲が「量子的に区切られた平面」に限定されると考えているから。

 一方、別空間に存在する光子同士の相対速度は「常に光速に固定」されて近づいたり遠ざかったりすると解釈する。これは「物質と光子の相対速度は常に光速に固定される」という現象と一致する。
 で、別空間に居る光子同士はお互いに干渉できないと考える。その場合、相対速度が光速で近づく光子が衝突する事はない。

 要するに、2次元空間の中だけで帰結する物理現象と、2次元と3次元が相互干渉する物理現象には違いが生じると自分は考えた。で、光子同士の相対速度には「0」の時と「光速」の時の2通りが存在すると考えた訳。

 つまり、光子群の相対速度が 0 の時だけ「波長」が観測可能になり、それによって電磁波が具現化されると自分は考えた。逆に、電磁波として知覚できない光子が宇宙にはランダムに飛び交っていて、それが先述の「黒体放射」のエネルギー源になっていると自分は予想した。

 一般常識として波は合成できる。が、それは3次元空間に居る人間には、複数の2次元空間を区別できないために「そのようにしか観測できない」と考える。
 波の合成によって一瞬「三角波」ができたとしても、それがその後の素粒子の挙動に変化を及ぼす事はない。波の合成は「一過性」のものに過ぎない。衝突したエネルギー波は何事もなく、ただ素通りするだけ。
 ただし、波の振動は「電磁気力」や「重力」の起源と考えられるので、光子自体のエネルギーは変化せずとも、空間の「場」に対しては力が作用すると予想できる。

 すると、宇宙を行きかっている無数の光子は、他の光子に追いつく事も衝突する事もできない…割と孤独な存在だと解釈できる。自分の考えでは、光子は空間に対して常に斥力を持つので、2つの光子の間に空間が挟まっている限り、光子同士が衝突する事は不可能と考える。


 そもそも、光速で移動する素粒子は質量 0 と考えられている。つまり、素粒子はエネルギーを具象化した「仮の粒子」なので、3次元空間で観測される「衝突」という物理現象とは無縁の存在と捉える事もできる。
 このトピックでは、光子同士の相対速度が「0」と「光速」の2通りあると仮定し、その理由を、複数の2次元空間の相互作用に求めただけの話。もっと説得力がある理論が存在するなら、素直にそれに従いたいと思っている。

 複数個の光子の運動を「振幅や波長の起源」と関連付けて考えようとするのは、むしろ自然な発想だと思う。これらの現象を踏まえた上で、一般化した波の波長と振幅を説明する必要がある。そこに「素粒子と空間の相互作用」があるのは誰もが気付くだろう。

 先ほど、光子同士が衝突・干渉する事はないと考えたが、その一方で、光子は3次元の物質に吸収されて光速の旅を終える。これを光子の視点で見ると、物質とは別次元・別空間へ接続するターミナルのようなものになる。

 今回はここまでとするが、それでも、かなり示唆に富んだ内容になったと思っている。

MSX-BASIC で音のドップラー効果を再現(長文)

 今回は、前回のエンジン音に、距離に比例して音が小さくなる仕組みを追加。さらにドップラー効果も加えている。エンジン始動時のセルモーターを回す時の「キュルキュル音」の再現にも挑戦している(イマイチだけど)。

 是非とも MSX実機で実行してほしい。110行の fclock を変更すれば、MSX以外の機種でも実行できるかもしれない。まあ、PSG(SSG) の性能に依存するとは思うが。

10 'written by foussin
20 'エンジン & キョリ2ジョウ & ドップラ-コウカ
30 '(MSX2+ ヒョウジュン・モ-ド)
40 '2019.3.9sat - 2019.3.15fri
50 :
70 '     12345678
80 'save"doppler .bas",a
90 :
100 'init
110 FC=1789772.5# 'fclock(MSX ノ バアイ)
120 SOUND8,0:SOUND9,0:SOUND10,0
130 :
140 CLS:PRINT"イグニッション!"
150 SOUND 7,&B110110 'noiseA,toneA
160 SOUND 8,16:A=1   'A(A=1),B(A=0)
170 SOUND13,14       '10,14(ワウワウsound)
180 I=1600           'I(rpm)
190 GOSUB 1380       'noise,tone sub:
200 I6=20:R6=I6
210 FOR J=0 TO 2
220  SOUND 6,R6
230  R6=(R6=0)*-I6
240  FOR T=0 TO 60:NEXTT
250 NEXT J
260 SOUND 8,0:FOR T=0 TO 20:NEXTT
270 :
280 'エンジン・キドウ->アイドリング  カンセイ ニチジ
290 '1200->3600->600(rpm)  (2019.3.2)
300 SOUND 7,&B110101'noiseA,toneB(A=0)
310 SOUND 6,10:SOUND 8,16:SOUND 9,11
320 SOUND13,8:A=0
330 I=1200:GOSUB 1380 'noise,tone sub:
340 GOSUB 1320        'print sub:
350 FOR T=0 TO 70:NEXTT
360 FOR I=3600 TO 1200 STEP-300
370  GOSUB 1380       'noise,tone sub:
380  IF I MOD 300=0 THEN GOSUB 1320
390 NEXT I
400 :
410 PRINT:PRINT
420 PRINT"アイドリング!(タンキトウ・エンジン ノ オト)"
430 I=600:GOSUB 1380  'noise,tone sub:
440 GOSUB 1320        'print sub:
450 FOR T=0 TO 800:NEXTT
460 :
470 PRINT:PRINT:PRINT"カウントダウン!:OOOO";
480 X0=POS(0):Y0=CSRLIN
490 SOUND 7,&B110000 'noiseA,toneABC
500 SOUND 8,16:SOUND 9,12:SOUND 10,0
510 I=600:GOSUB 1380 'noise,tone sub:
520 J=1:K=3:HZ=440
530 ON INTERVAL=60 GOSUB 560
540 INTERVAL ON:GOTO 660 'skip
550 :
560 'interval timer sub:**************
570 LOCATE X0,Y0:PRINT K;
580 X=X0-J:J=J+1:CT=0
590 LOCATE X,Y0:PRINT"*";
600 IF K=0 THEN WT=300:HZ=880
610 TP=FC/(16*HZ):K=K-1
620 C5=INT(TP/256):F4=INT(TP-(C5*256))
630 SOUND 5,C5:SOUND 4,F4 'ch-C
640 SOUND10,12:RETURN
650 :
660 IF K<0 THEN 700
670 IF CT=1 THEN 660
680 FOR T=0 TO 60:NEXTT:SOUND10,0
690 CT=1:GOTO 660
700 INTERVAL OFF
710 :
720 PRINT:PRINT:Y=CSRLIN 'スタ-ト!
730 'ギア1-4:カソクド(イドウキョリ) ト タイオウ サセル
740 '      :ボリュ-ム ト キョリ2ジョウ ヲ タイオウ
750 '      low   high       サイコウソクド
760 ' 1st: 2100- 7200(rpm)  120km/h(Hz)
770 ' 2nd: 4200-10500       175km/h
780 ' 3rd: 7500-13200       220km/h
790 ' 4th:11400-16500       275km/h
800 ' 5th:14400-19200       320km/h
810 ' [topギア(5th) ハ ロング・ストレ-ト センヨウ]
820 SOUND 6,12:DIM LO(5),HI(5)
830 LO(1)=2100 :LO(2)=4200 :LO(3)=7500
840 LO(4)=11400:LO(5)=14400
850 HI(1)=7200 :HI(2)=10500:HI(3)=13200
860 HI(4)=16500:HI(5)=19200
870 :
880 'キョリ2ジョウニ ヒレイシテ オトヲ チイサクスル ジュンビ
890 TP=.6 'TP(km:オリカエシテン:Turnin'Point)
900 CT=1      'CT(オリカエシ カウンタ)
910 A=13:B=10 'volume:A(4-13) B(1-10)
920 S=0 :RS=0 'S(ソウコウキョリ) RS(ソウタイキョリ)
930 TM=0:TB=1 'TM(time) TB(Turn Back)
940 CM$=" (チカヅク) " 'coming
950 GO$=" (トオザカル)" 'going
960 :
970 ON INTERVAL=28 GOSUB1650'print sub:
980 INTERVAL ON
990 SOUND8,A:SOUND9,B
1000 FOR J=1 TO 5     'オ-トマ・ギアシフトアップ
1010  FOR I=LO(J) TO HI(J) STEP 330
1020   GOSUB 1500     'tone sub:
1030  NEXTI
1040  IF J=CT THEN 1040
1050 NEXTJ
1060 J=5:I=19200      'サイコウソク デ シュウカイ
1070 GOSUB 1500       'tone sub:
1080 IF CT=7 THEN 1100 ELSE 1070
1090 :
1100 INTERVAL OFF:SOUND 7,&B111000'=56
1110 SOUND 8,0:SOUND 9,0:SOUND10,0
1120 AG=INT(S/TM*3600+.5):PRINT
1130 PRINTUSING"ヘイキン ソクド:###km/h";AG
1140 END
1150 :
1160 '** ドップラ-コウカ(doppler effect) **
1170 'f0:シュウハスウ(Hz)
1180 'v :オンゲンガ ウゴク ハヤサ(m/s or km/h)
1190 'V :オンソク     (340m/s or 1224km/h)
1200 '            (タダシ V>v トスル)
1210 'f :キコエル オトノ シュウハスウ(モトメル アタイ)
1220 '
1230 'オンゲン ガ チカヅクトキ(キクヒト ハ セイシ)
1240 ' f=V/(V-v)*f0
1250 '
1260 'オンゲン ガ トオノク トキ(キクヒト ハ セイシ)
1270 ' f=V/(V+v)*f0
1280 '
1290 ' f=1224/(1224+FE*TB)*FE
1300 ' コレデOK!:FE=シュウハスウ(Hz)=ジソク(km/h)
1310 :
1320 'print sub1(ニュ-トラル):**************
1330 Y=CSRLIN:LOCATE 0,Y
1340 PRINTUSING"N:#####rpm";I;
1350 PRINTUSING"(##Hz)";INT(FE+.5);
1360 RETURN
1370 :
1380 'noise & tone sub:(エンベロ-プ)******
1390 FE=I/60:EP=FC/(256*FE)
1400         CT=INT(EP/256)
1410         FT=INT(EP-(CT*256))
1420   TP=FC/(16*FE)
1430   C4=INT(TP/256)
1440   F8=INT(TP-(C4*256))
1450 SOUND12,CT:SOUND11,FT 'ch-A
1460 IF A=1 THEN SOUND1,C4:SOUND0,F8 'A
1470 IF A=0 THEN SOUND3,C4:SOUND2,F8 'B
1480 RETURN
1490 :
1500 'tone sub(doppler effect):********
1510 INTERVAL STOP
1520 FE=I/60:DP=1224/(1224+FE*TB)*FE
1530 FP=FC/(16*DP)           'ch-A
1540 C1=INT(FP/256):F0=INT(FP-(C1*256))
1550 FP=FC/(16*(DP-20))      'ch-B
1560 C3=INT(FP/256):F2=INT(FP-(C3*256))
1570 SOUND 1,C1:SOUND 0,F0   'ch-A
1580 SOUND 3,C3:SOUND 2,F2   'ch-B
1590 IF I>3500 THEN SOUND10,0'ch-C(off)
1600 INTERVAL ON:RETURN
1610 :
1620 'print,volume sub:(インタ-バル・タイマ)***
1630 '0.5sec ゴトニ S,RS(キョリ) ヲ ケイソク
1640 'maxVolume/(rs*10)^2+minVolume
1650 TM=TM+.5:Q=FE/7200:S=S+Q
1660 RS=RS+Q*TB
1670 IF RS>TP OR RS<0 THEN GOSUB 1840
1680 IF TB=1 THEN RE$=GO$ ELSE RE$=CM$
1690 SS=RS*RS*100+2 '+2(ビチョウセイ)
1700 A=INT(13/SS+9.5)
1710 B=INT(10/SS+6.5)
1720 IF A>13 THEN A=13:B=10
1730 SOUND8,A:SOUND9,B
1740 LOCATE 0,Y
1750 PRINTUSING"#:#####rpm";J;I;
1760 PRINTUSING"(###km/h)";INT(FE+.5);
1770 PRINTUSING":###.#sec";TM
1780 PRINTUSING"  ソウコウキョリ:#.##km";S
1790 PRINTUSING"  ソウタイキョリ:#.##km";RS;
1800 PRINT RE$:RETURN
1810 :
1820 '(RS>TP) or (RS<0) sub:**********
1830 '(ドップラ-コウカ ノ カワリメ ノ ショリ)
1840 IF RS>TP THEN 1860 ELSE 1850
1850 RS=ABS(RS):TB=1:ST=-1:GOTO 1890
1860 RS=TP-(RS-TP):TB=-1:ST=1:CT=CT+1
1870 IF CT=7 THEN RETURN
1880 :
1890 Q0=1224/(1224+FE)*FE 'トオノク(low)
1900 Q1=1224/(1224-FE)*FE 'チカヅク(high)
1910 IF TB=1 THEN SWAP Q0,Q1
1920 Z0=0
1930 Z0=Z0+1:Z=FE+(Z0^2+J)*ST
1940  FP=FC/(16*Z)               'ch-A
1950  C1=INT(FP/256):F0=INT(FP-C1*256)
1960  FP=FC/(16*(Z-20))          'ch-B
1970  C3=INT(FP/256):F2=INT(FP-C3*256)
1980  IF ST=1 AND Z>Q1 THEN 2020
1990  IF ST=-1 AND Z<Q1 THEN 2020
2000 SOUND1,C1:SOUND0,F0         'ch-A
2010 SOUND3,C3:SOUND2,F2:GOTO1930'ch-B
2020 RETURN

 今回は、上記のコードが書かれたプロセスを詳しく紹介する。コードを書いたのは2年前だが、今の自分は Windows10 マシンが故障中なので、MSX-BASIC, MSX-C でコーディングしている。興味がある人は各自研究してみて。

 まずは「ドップラー効果」について。

ドップラ-効果:doppler effect
--------------------------------------
  f0 振動数
     (単位時間が秒なら周波数を意味する)
  u  音源が動く速さ
  v  聞く人が動く速さ
  V  音速(空気中の音波の速さ)
     (ただし V>u, V>v とする)
  l  音波の波長(lambda:ラムダ[λ])
--------------------------------------

聞こえる音波の振動数 f を求める:

聞く人が静止して音源が動く場合:
・音源が近づく時:
  f = V/l = V/(V-u) * f0
・音源が通り過ぎる瞬間:
  f = f0
・音源が遠ざかる時:
  f = V/l = V/(V+u) * f0

 音速を 340m/s(1224km/h)として、F1マシンがエンジン回転数19200rpm、時速315km で通り過ぎる場合を考える。rpm は毎分回転数なので、これを毎秒回転数 rps = rpm/60 に直す。1秒間あたりの振動数を周波数(Hz)と呼ぶので rps = Hz と解釈できる。これが f0 となる。

  f0 = 19200/60 = 320 rps = 320 Hz
 これを上記の式に当てはめれば...

 ・近づく時:f = V/(V-u) * f0
    1224/(1224-315) * 320 = 約431 Hz
 ・遠のく時:f = V/(V+u) * f0
    1224/(1224+315) * 320 = 約255 Hz

...となる。F1 マシンの場合、近づく時と遠のく時の差が約 180 Hz もあり、近所で体験できる普通車のドップラ-効果とは雲泥の差がある。時速60キロで走っている一般車のドップラ-効果の差は、せいぜい 10Hz ぐらいしかない。

音源が静止して聞く人が動く場合:
・聞く人が近づく時:
  f = (V+v)/l = (V+v)/V * f0
・聞く人が通り過ぎる瞬間:
  f = f0
・聞く人が遠ざかる時:
  f = (V-v)/l = (V-v)/V * f0

 仮に、聞く人が音速を超えて動いていた場合は、音源の音波をどこかで追い越してしまうので、途中から音が一切聞こえなくなる。音波を追い越す瞬間は、音源の波長がものすごく引き伸ばされるので、予想外の重低音が聞こえるはず。
 要するに、非常に極端なドップラ-効果を体験するが、超音波になって人の耳には聞こえないと思う。

 仮に、音源が音速を超えて動いていた場合は、音源が聞く人を追い越し、しばらく経つまで音は一切聞こえない。で、音が聞こえると同時に衝撃波(ソニックブ-ム)も届く。


エンジン音の再現には「波」の知識が必要:

 車のエンジン音は rpm (毎分回転数)を使えばシミュレ-トできる。これはピストンの振動数と言える。これを毎秒回転数で表現すると、それは「エンジンの周波数」と解釈することができる。

毎分回転数:rpm(revolution per minute)

毎秒回転数(rps) = rpm/60 = 周波数(Hz)

 ところで、エンジン音は特定の周波数を持たないノイズでありながら、アクセルを踏み込んで回転数を上げると音が高くなる。これは人間の耳が、エンジン音(ピストンの振動数)を音の周波数として知覚するためだ。

 波の波長と振動数は必ず反比例する。仮に比例関係になるためには、波の伝わる速さが変わる必要がある。が、波の速さは媒質の性質で決まってしまうので、それはあり得ない。で、エンジン回転数(振動数)を上げると波長は逆に短くなり、音が高くなる。波長と振動数が反比例するのは、あらゆる波に当てはまる(電磁波も然り)。

 MSXサウンド・ジェネレ-タ(PSG音源)では「ジェットエンジン」の音も再現できる。例の「キ--ン」という音がジェットエンジンの音だ。
 あの音はエンジンの毎分回転数が 8万~30万rpm ぐらいで聞こえ始める。間を取って 20万rpm を毎秒回転数に直すと 約3300rps となる。rps = Hz なので 3300Hz の音が聞こえる計算になる。で、ジェットエンジンの音は 1300~5000Hz 程度の周波数ということになる。

 3300Hz をMML(ミュージック・マクロ・ランゲージ)の音階に直すと "o7A" ぐらいに相当する。大したことないと思うかもしれないが、甲高い音と思われている F1 サウンドでさえ、せいぜい 320Hz("o4E" 程度)ぐらいだ(時速300km のドップラ-効果を加えると 430Hz ぐらいで聞こえる)。
 エンジン音にはノイズも大量に混ざっているし、何よりも音量が桁違いに大きいので(爆発音だし)、楽器や肉声の聞こえ方とは雰囲気が異なるのだ。


距離の 2乗に比例して音を小さくする:

 ドップラ-効果をリアルに再現するには「距離の 2乗に比例して音が小さくなる」効果も必要になる。音源と聞く人の距離によって音は小さく聞こえたり大きく聞こえたりする。これは次の式で表現できる。

  maxVolume / s^2 + minVolume

  s:音源と観測者の距離(m or km)
  maxVolume:最大音量
  minVolume:最小音量

 距離 s の単位は km でも m でも構わない。maxVolume, minVolume は PC のボリュ-ムの範囲内を指定する。MSX のボリュ-ムの範囲は 0~15(4bit) なので、例えば次のように記述すれば良いはず...

  int(13/s^2+6.5)  '.5 は四捨五入用

 だが、s<1 (1未満) だと計算結果が最大音量(13)を超えてしまうので if 文で場合分けする必要がある。さらに s=0 だと division by 0 エラ-が発生するので、トラップを仕込んでおく必要もある。

 まあ、観測者と音源の距離が 0 になるということは、観測者と音源が衝突することを意味するので、通常はある程度の距離まで近づいたら、0 になる前に遠ざかり始めるようにコ-ド化すれば、トラップを用意する必要はない。


音量の単位は dB:

 ところが、場合分けやトラップを仕込んでおいても、この指定ではうまくいかない。その理由は「音量の単位」にある。音量の単位には dB(デシベル) が使われるが、この dB は「対数(log)スケ-ル」になっている。正確には、dB は音量の単位ではないが詳細は省く。要するにボリュ-ム範囲が 0~15 というのは、実は...

  2^0 ~ 2^15 (1 ~ 32768)

...を意味する。で、そうやって計算した結果を log() 関数に渡せば 0~15 の範囲内に戻すことができる。つまり次のように記述する(場合分け、トラップは省略)。

  'maxV:2^13, minV:2^6, s:1以上(m)
  a0 = 2^13 / s^2 + 2^6
  a = int(log(a0))
  sound 8,a

 このコ-ドを、s(距離) を変化させるル-プ中に置けば、かなりリアルな音量変化が見込める。が、このコ-ドにも問題がある。
 それは MSX の CPUクロック周波数が約 2~4 MHz しかないので、ル-プ中に複雑な数学関数を使用すると露骨に実行速度が遅くなってしまうのだ。これでは残念ながらリアルなシミュレ-ションは望めない。MSX turboR(16bit CPU) ならスム-ズに実行できると思うが...

 MSX-BASIC では、if, print, log, exp, ^(べき乗演算子) などをル-プ中で多用すると、露骨に実行速度が遅くなってしまう。最低限の実行速度は確保したいので、正確さの追求は諦め、適当にごまかす方法を 2通り考えた。

  '1: s(0~0.8 km) dt(微調整 定数)
  'int(maxV - s^2 * dt +.5)
  a=int(13-s*s*3+.5)       '文例

  '2: s(0.1~0.8 km)
  'int(maxV / (s*10)^2 + minV +.5)
  a=int(13/(s*s*100)+6.5)  '文例

 1: の方法では division by 0 エラ-を気にしなくて済むが、距離が大きくなると結果が負数になる可能性がある。微調整定数はトラップの条件設定次第で変える。問題は 2次関数的な音量変化があまり感じられないところ。そこがちょっと不満。

 2: では、結果が maxV を超えない工夫として 10^2 を掛け合わせた。これによって 100m(0.1km)単位で 1, 1/4, 1/9... と音量変化が適用される。距離が 0.1km 未満だと maxV を超えるので何らかのトラップが必要になる。0 除算トラップも必要だが、わりと自然な音量変化が実現できる。非力な 8bit CPU の PC なら、これはお薦めの式だと思う。

 距離の上限は 0.8 km ぐらいが適当と思われる。それ以上は音量が小さくなりすぎて、よく聞こえなくなるからだ。距離が遠くなりすぎる場合は minVolume がセットされ、それ以上音が小さくなることはない。距離の上限は、エラ-になるとかそういう理由で設けているのではない。


MSX-BASIC は遅いので、MSX-C を試してみた:

 log() 関数を使ってリアルな音量変化を再現しようとすると、実行速度が極端に遅くなって使い物にならなかった。そこで MSX-C を使ってみようと思って、ちょっと調べてみた。結論から言うと、MSX-C は使えない... 役不足だった。

 書籍「MSX-C 入門」上・下巻には sound文と同等の sound() 関数が「特製ライブラリ」にて用意されていた。が、もっと根本的な仕様に問題があった。それは、扱える数値が int or unsigned 限定というところ。つまり 2バイト整数(16bit)しか扱えない。

-32768~32767 (符号付き整数:int型)
     0~65535 (符号無し整数:unsigned型)

 実数が使えないので、log(), sin() などの数学関数が使えない。当然、実装もされていない。log() が使えないので「音量が距離 2乗に反比例する」シミュレ-ションも実現できそうにない。試しに、整数で「割り算」「剰余」を計算したら次のようになった。

ソ-スコ-ド(test.c):

#include <stdio.h>

/* test.c (2019.3.28thu) */

main() {
  int i;  /* ヘンスウセンゲン ハ セントウ デ ヤル */
  char p; /* % キゴウ (percent) */

  puts("セイスウ(int)デ ワリザン(/) ");
  puts("& ジョウヨ(%)\n");

  for (i = 1; i < 10; ++i) {
    printf("9 / %d = %d : ", i, 9 / i);
    printf("9 %% %d = %d\n", i, 9 % i);
  }
  putchar('\n');
  p = '%';
  for (i=1; i<10; ++i) {
    printf("7/%d = %d : ",i,7/i);
    printf("7%c%d = %d\n",p,i,7%i);
  }
}

実行結果(リダイレクト出力):

セイスウ(int)デ ワリザン(/) & ジョウヨ(%)
9 / 1 = 9 : 9 % 1 = 0
9 / 2 = 4 : 9 % 2 = 1
9 / 3 = 3 : 9 % 3 = 0
9 / 4 = 2 : 9 % 4 = 1
9 / 5 = 1 : 9 % 5 = 4
9 / 6 = 1 : 9 % 6 = 3
9 / 7 = 1 : 9 % 7 = 2
9 / 8 = 1 : 9 % 8 = 1
9 / 9 = 1 : 9 % 9 = 0

7/1 = 7 : 7%1 = 0
7/2 = 3 : 7%2 = 1
7/3 = 2 : 7%3 = 1
7/4 = 1 : 7%4 = 3
7/5 = 1 : 7%5 = 2
7/6 = 1 : 7%6 = 1
7/7 = 1 : 7%7 = 0
7/8 = 0 : 7%8 = 7
7/9 = 0 : 7%9 = 7

 実際に試してみたら、この程度のコンパイルでも 1分ぐらい待たされた。全ての工程を ramdisk で処理すればもっと高速化できるが、lib\*.rel, include\*.h ファイルまで全部 ramdisk に格納するのはちょっと無理。。。

 ドップラ-効果を再現するなら、周波数を 12bit(音声周波数), 16bit(エンベロ-プ周期)に分周し、2つのレジスタに格納する必要がある。が、fclock が 1789772.5 Hzあるので、int 型ではちょっと無理。さらに、実数や log() が使えないので dB <=> vol 変換をするのも絶望的だ。

 符号無し整数を 2つ使って「上位桁」「下位桁」に分けて計算する方法を考えれば、整数型だけでも処理できると思うが、自分にはちょっと荷が重い。あと、計算ル-チンが複雑になると高速実行が売りの C 言語の恩恵が感じられないかもしれない。。。

 書籍によると、別売の「MSX-C ライブラリ」を使えば、実数や倍精度整数が使えるらしい。「MSXマガジン 永久保存版1~3」の付属ディスクとかに入ってないかと探してみたが、無いみたい。。。

 MSX-BASIC の数値演算ル-チンは「Math-Pack」と呼ばれる ROM-BIOS に格納されていて、これらを呼び出すことで実数演算や数学関数を利用できる。cos,sin,log,sqr,rnd 等の関数もここに格納されている。

 実数表現には「単精度」と「倍精度」があり、単精度(6桁)は 4バイト、倍精度(14桁)は 8バイトで表現される。
 オペランドを格納する DAC(f7f6H),ARG(f847H) は共に 16bit(2バイト)サイズだが、BCD型式の浮動小数点で格納されるので実数が使える。


 なんか、途中から MSX-C の話題に脱線してしまったが、非力な MSX でリアルな音声出力を実現するには、色々と単純化(というかズル)が必要になる。
 例えば「周波数(Hz)=時速(km/h)」として画面表示しているのも、その1つだ。本来ならトルク計算をして馬力と速度を関連付けすべきだが、MSX では荷が重いのでズルをした訳。


 ところで最近、フロッピードライブを酷使し過ぎたようで「リード/ライト・エラー」が頻発し始めた。MSX のフロッピードライブは「ベルトドライブ駆動」なので、長期間使っているとゴムベルトが伸びきってしまうのだ。
 MSXフロッピーディスクは、今となっては「古文書」みたいなもの。貴重なデータなので壊したくない。ベルトを手配し、交換するまでは MSX をしばらく休眠させよう。

 そうなると、ネカフェでテキスト入力する必要があるが、それはそれでキツイ。本気で「中古ノーパソ」を探して見るか。。。
 こういう記事を「はてなブログ」で書くなら、やっぱり「見たまま入力」よりも「はてな記法」の方が断然便利だ。今回はこんなところ。以上。

経過報告(2021.4/22):

2021.03.04 thu:ブログ開設
2021.03.18 thu:pv  8:入金 0 (開設から2週間)
2021.04.01 thu:pv 21:入金 0 (開設から4週間)
2021.04.22 thu:pv 40:入金 0 (1か月+3週間)

 駄目だな。色々とブロックされてるみたい。ちなみに、上記の pv に自分のアクセスは含まれていない。自分のブログは、いつもログインした後で見てるので。ネカフェからログインしてるので、ブラウザのブクマ登録も出来ないし…

 自分はただ、世界は問題だらけなのだから良い社会を作っていくには、その問題点に気付いて解決策を見つけよう…と提案してるだけなのだ。それを、自分に都合の悪い事案には蓋をして無かった事にして済まそうとしている。
 当ブログでは、資本主義の矛盾も社会主義の矛盾も公平に扱っている。それぞれの問題点を明らかにする事は、価値観が異なる文化圏が対話のテーブルに着く基盤になるので、目を背けては駄目だと言っているだけである。

 今回のコロナ・ショックでの問題の根っこにあるのは、何よりも国家間の経済格差であり、それが国内の格差問題にまで波及してきていると自分は主張する。そこで重要な事は、上から目線の施しではなく「足並みを揃える事に意識を集中した国を越えた連帯だよね」と訴えている。

 で、現在の問題点を解決し、平和な新世界を迎えるためには、まずは世界中の民主主義者が声を挙げて「世界世論の高まり」を権力者が無視できないように仕向けて行く必要がある。

 シビアに効率化を要求してくる資本主義や社会主義に振り回されると、仕事と娯楽の事しか考えられなくなる。仕事が終わったら、後は娯楽を楽しんで本日はおしまい…後は食って寝るだけ。それが生活のルーティーンになってしまう。
 その気持ちは分かるが、民主主義というのは「常に現在進行形の事案」であることを忘れないでほしい。民主主義を後回しにしていると特に緊急時に、いつの間にか民主主義が骨抜きにされていた事を思い知るハメになる。

 だから、仕事・娯楽・民主主義の3つを「常に生活のルーティーン」として、後回しにしない事が重要だ。3つを合わせたものが「生きる=生活=衣食住」を支えるものという認識が必要だ。
 我々は、とかく「仕事」と「生活」を別概念のものと捉えがちだ。それは効率を重視する資本主義または社会主義に洗脳された結果に過ぎない。本当は、生活という「集合」の中に含まれる1要素として仕事が含まれているに過ぎない。

 生活とは生きる事そのものである。生きる事と仕事を分離するのは、よく考えれば変な話だと分かる筈。仕事を生活から分離されてしまうと、働く人間は「歩く死人」にされてしまうのだ。
 常に本質を見誤らない「自立した考え」を持つ事が重要だ。そうしないと、自分が何のために生きているのかも分からなくなってしまう。

 特に、資本主義・社会主義の両者は「便利と民主主義をトレードオフの関係」にしたがる。便利を餌に民主主義を犠牲にするのだ。だから「便利」に飛びつく前に、慎重に考える必要がある。

 民主主義が機能した社会であれば、そもそも「生理の貧困」などという問題は起こる筈がない。「国民主権」が民主主義の大原則なのだから、国民が必要とする物が行き渡っていないのは、民主が正常に機能していない事を示している。
 その根本原因が、所得の不均衡・不公平による格差拡大にあるのは明白だ。しかも、それは日本だけの問題ではなく、世界中で同時に起こっている。これは、現在の世界経済が「再分配政策が効きにくい仕組み」になっているのが最大の原因である。

 民主主義者の多くは金に執着しない貧乏人が多い。なので、経済力で弱者を救う力は持ち合わせていない。が、知恵なら提供できる。そして少数派を排除せず、少数派の味方として「多数派に反論する勇気」だけは失わないように、肝に銘じている。
 よく「積極的傍観者」という言葉を聞く。その本質は「多数派に意見普請できる勇気」を持つ事だ。自分の場合、それがたまたま「少数派の味方」として具現化しただけと考えている。誰だって、好き好んで少数派になる訳ではないのだ。

エンジン音をシミュレートする 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 までループさせているが、年寄りには聞こえにくいモスキート音レベルの高周波だ。ジェットエンジンがどんだけ燃料使ってるかが想像できる。


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

3つの力(強い力・電磁気力・重力)の謎について考えた…

(思考実験:2021.4.17 Sat ~ 2021.4.19 Mon)

 この宇宙は「4つの力」が支配する空間と考えらている。強い力・弱い力・電磁気力・重力の4つだ。このうち「弱い力」については分かり易い説明と出会えていないので、自分には上手く説明できない。なので「弱い力」は言及しない事にした。

 今回の記事は、前回の「距離2乗」を、さらに応用したものだ。で、従来の常識から飛躍するための最大の要点は「空間は量子化できる有限個数の存在である」と解釈する事だ。
 つまり宇宙空間には、画像ソフトでお馴染みの「レイヤー構造」のようなものが存在していると考えるのだ。


重力の謎について考えてみた:

 今回は、重力波・縦波・ヒッグス粒子を関連付けた個人的な仮説を晒してみる。重力が電磁気力よりも桁違いに小さい理由が、それで説明できるんじゃないかと思って思索中。。。
 地震波には縦波と横波がある。縦波は早く着くがエネルギーは小さい。で、自分が考えたのは、重力波ヒッグス粒子に作用する縦波だとしたら、重力が桁違いに微弱な力である事を説明できるんじゃなかろうか…と考えた訳。

 横波は空間の中で「限定的な平面」を振動させて伝わる性質があると考える。テレビのアンテナを正しい向きにしないと受信できないのは、そのためと考える訳。横波に指向性があるのはそのためだと考える。

 で、限定的な平面とは、量子的に区切られた区画が存在する事を意味する。宇宙空間は連続した無限のアナログ量ではなく、厳密には「有限のデジタル量」で出来ていると考えるのだ。という訳で今、我々は量子論の入り口に立った。

 一方の縦波は、空間の中で「球状に膨張するように」立体的に伝わると考える。縦波は、空間に詰まった粒子を「玉突き」しながら伝わるので、立体的に伝わると考えるのは理に適っている。筋が通っている。

 そうすると、横波は面積(2次元)に作用する波で、縦波は体積(3次元)に作用する波と捉える事ができる。
 面積と体積では、作用する量が全く異なる。「単位空間」辺りに占める強度にも決定的な違いが生じる筈だ。それが、重力が微弱な理由にならないだろうか…と考えた訳。
 この仮説が正しいとすると、電磁気力と重力の「力の割合の比率」から「宇宙の厚み(体積)」が計算できる筈だ。

 しかし、だとしたら縦波は「距離の3乗」に比例して振幅が弱まる筈じゃないの?…と思うかもしれない。それについては、観測者(観測点)が平面空間の1点に居るために、観測者は「距離の2乗」の力しか知覚できない…と考える。
 つまり、空間に占める力の総和は「距離の3乗」で計算するが、観測者が実際に感じる力は「距離の2乗」で計算した値と一致する。これも一種の相対的な考え方と言えるかもしれない。


強い力についても考えてみた:

 そうこう考えていると「強い力」が桁違いに強力で、作用する距離が短い理由も説明できそうな気がしてくる。ただ、「弱い力」については分かり易い資料が少なくて、自分も正しく理解できていないので除外した。
 自分の考えは、これらの力は面積や体積に作用する力ではなく、粒子同士の2点間の最短距離を結ぶ直線、つまり1次元に作用する力ではなかろうか、と予想できる訳。

 だが、予想はできても何故そうなるかが全く説明できない。力の起源は「素粒子と空間の相互作用」…この論点から外れずに、どう解釈すべきか。何といっても「1次元空間の振動」というのが理解不能

 考えに行き詰った時は発想の転換が必要になる。我々は3次元の世界に生きている。そこで、3次元の世界で「1次元の力」がどのように現れてくるだろうか、という可能性を探ってみた。
 1次元は直線の世界だ。その直線状に2つの粒子が存在し、相互作用するとしたら「直線空間そのものが回転運動を始める」のでは、と考えた。想像してほしい。惑星の公転運動を真横から見れば、それは「1次元で振動」する反復運動そのものだ。

 つまり、1次元空間の振動が「回転運動」を生み出し、回転運動は「回転面」という2次元空間(平面)を生み出す。要するに、1次元の力は「ビッグバン以前」の、インフレーション以前の3次元宇宙誕生に関わるエネルギー源になっていると推測できると思う。

 で、仮説結論はこうなる。1次元空間では「力が働く範囲が直線状に限定」され、その結果、粒子間に働く力が「1点集中」されるために電磁気力や重力とは比較にならない強大な力が働く。これが「強い力」の正体だと考える。
 この強大な力は、粒子間の配置を固定して動けなくするが、粒子間の相互作用で1次元空間自体を振動させる。その振動は回転運動となって具現化する。

 この力は回転運動(1次元空間の振動)の中だけで閉じてしまうので、外の世界(2次元空間・3次元空間)へ染み出す事ができない。それが「強大な力でありながら力が及ぶ範囲が狭い事」の理由と考える。
 言い方を変えると、1次元の力(強い力)は「2次元空間・3次元空間」を生み出すための変換エネルギーとして使われてしまうので観測できない…という表現もあるかもしれない。。。

 上記は、粒子が直線状(1次元空間)に配置された場合の話。だが、1次元空間の振動が平面空間を生み出す。平面空間では、3個以上の粒子の配置位置の自由度が増す。
 平面的配置の粒子間に対しても「強い力」は直線的に作用する。強すぎる力のせいで、粒子の配置は固定されたまま回転し始める。これは地球の自転運動のような「球の回転運動」の起源となる筈だ。つまりそれは、3次元空間の起源にも成り得る力と言える。

 物質の起源といえる陽子・中性子は、3個の素粒子(クォーク)で出来ている。で、クォークは1次元の力で束縛されていて、それは電荷による斥力よりも桁違いに強い力で結束される。
 なぜなら、電荷の起源は「電磁気力」であり、電磁気力は平面(面積)に作用する力と考えられるため、面積の広さに応じて力が分散されてしまうからだ。


 そんな訳で「4つの力」の強弱の違いが「作用する次元」に起因するというのが自分の仮説だ。空間が量子化可能な存在だと仮定するなら、この仮説には矛盾がなく、スマートに言語化されていると思うのだが、どうだろう。

 自分が「表現者」として、特に肝に銘じているのは「概念を固定化した専門用語だけを使っていては、未知の事象を分かり易く説明する事はできない」という事だ。
 これを読んで「腑に落ちた」と思った専門家も多い筈。専門家は、常にそのジレンマに悩まされるからだ。自分は「専門家が何を言いたいのか」を、じっと観察してきた末に、現在の表現力を獲得したと自負している。

 で、一応断わっておくが、この文章は紛れもなく自分の著作物である。ここで使った表現が必要だと思ったら、ちゃんと引用してください。自分は既に自然科学のスポークスマン、民主主義のスポークスマンとして、ずっと社会貢献してきた自負がある。それを忘れないでほしい。


考えに行き詰った時は発想の転換が必要になる:

 かつて2000年代に「ダライラマ14世」が来日した時、日本の若者を集めての講義が開かれた。その時、彼は若い女性の質問に対して「考えに行き詰った時は視野を広げるのが良い」と言った。
 当時は平成不況の真っただ中にあり、未来に希望が持てない時代だった。その講義の様子は、当時のEテレで放送され、自分の脳裏にも深く刻み込まれた。
 コロナ禍の今も当時と同様、未来に希望が持てない時代になりつつある。現状を放置してやり過ごしてしまうと、自分らの世代が味わった理不尽を、今の現役世代が同じように味わう事になると自分は危惧している。

 ネット上で社会主義全体主義が浸食している現在、ダライラマ14世という固有名詞は非常に危険なキーワードになっている。しかし「科学は真実に忠実なスタンスで臨む」のが原則だ。
 政治家や権力者の詭弁に忖度しては科学は発展しない。しかも、我々日本人は民主国家に居住している。堂々と真実の科学を議論すべきだ。
 こういう記事が自由に読めるのも、元を正せば「民主主義」が機能している社会に居るお陰だという事を、しつこく強調しておく。


 次回は、今回のトピックの発端となった「距離2乗」を使ったプログラムを紹介する。が、自分の Windows10 マシンは未だに故障中なので、MSX-BASIC のコードを紹介する。
 sound文を使って「エンジン音」をシミュレートする。で、距離に比例して音が小さくなる仕組みとドップラー効果も加えている。
 が、残念ながら、MSX実機で実行しないとリアルな音は出ないと思う。MSXエミュレータでは、MSX本来の PSG音源(SSG音源)の音は再現が難しいようだ。昔、試してガッカリした事があったので。。。