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|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|
2025|01|02|03|04|05|06|07|08|

2025-08-09(Sat) 理詰めすぎたエンジン音

  前回、エンジンの回転数を元に、理詰めでエンジン音の生成を試みたのだが、概ね、コレジャナイ、という音になった。主な理由は音の成分が単一だからだ。

  走行音には、エンジン音以外にも、いろいろな音が混じっている。プロペラシャフトは、エンジンの回転数に同期して回転するが、ギアボックスはそれを何種類かの回転数に落とし、ドライブシャフトを回転させ、それに同期してホイールやタイヤも回転する。要するに、クルマは回転速度の異なる回転物体の集合体だということだ。それらは、1回転に1音とは限らず、様々な音を発する……結局、走行音は、様々な周波数が混じりまくった音なのだ。

  そこで、実際のレッドブルのオンボード映像の走行音をスペクトル分析してみた。対象はシフトアップする直前の0.1秒分。

  画像の説明

  支配的なのは200Hz弱と300Hz弱。後者がエンジン音だろう。が、それ以外にも高音成分がピョコピョコとある。

  それに引き換え、単純なノコギリ波だとこう。300Hzのn倍に無数にピークがあるが、規則的すぎる。これだと、聴感上はシンプルな印象になってしまう

  画像の説明

  そこで、基本となる300Hzのノコギリ波に、異なる周波数のノコギリ波をいくつも足してやる。

@length = 1
 
car1 = it = {}
it[:device] = 'generate'
it[:length] = @length
it[:type] = 'sawtooth_r'
it[:freq] = [(r = 300) * 10500 / 12000, r]
it[:amp] = [0.3]
 
car2 = it = {}
it[:device] = 'generate'
it[:length] = @length
it[:type] = 'sawtooth_r'
it[:freq] = [(r = 180) * 10500 / 12000, r]
it[:amp] = [0.4]
 
car3 = it = {}
it[:device] = 'generate'
it[:length] = @length
it[:type] = 'sawtooth_r'
it[:freq] = [(r = 800) * 10500 / 12000, r]
it[:amp] = [0.15]
 
car4 = it = {}
it[:device] = 'generate'
it[:length] = @length
it[:type] = 'sawtooth_r'
it[:freq] = [(r = 1500) * 10500 / 12000, r]
it[:amp] = [0.15]
 
add = it = {}
it[:device] = 'add'
 
@connection = [ car1, car2, car3, car4, add, add, add ]

  こんな音になった。まぁ、元のシンプルすぎる音よりは、だいぶ厚みが出て多少はそれらしくはなった。スペクトルはこう。多少なりとも似た感じになってはいる。まだまだ、コレジャナイ、という音ではあるが。

  画像の説明

  と、ここでアプローチを変えてみる。そもそも「支配的な音はエンジンの『燃焼』時の破裂音だから、音色は『鋸歯状波』に近い」という仮定は正しいのか。間違いなく正弦波ではないのだが、単純な鋸歯状波でもないだろう。

  実際のレッドブルのオンボード映像の走行音の波形はこうだ。

  画像の説明

  先の、複数のノコギリ波を重ね合わせたものがこう。

  画像の説明

  似ても似つかない。やはり、もう少し波形の形を似せないと、コレジャナイ、を脱出することはできないのではないか。と、ここで奇しくも、再びレトロゲー技術を投入することになるのであった。つづく。


2025-08-26(Tue) ちょっとウェブサーバ起動しといてくんない?

  ここんとこ「TopDrivin」の開発に夢中で、ゲームする間も惜しんで(?)、物理挙動やら、エンジン音やら、ラップタイム表示やら、次々に実装を進めている……のだが、その開発記事を書くのが追いつかない。どれも面白いコードばかりなのに。

  そこで気分を変えてプログラミングする(?)ことにする。ちょっと前から構想していた、AIによる自律端末操作。要するに、AIにコマンドを考えさせて、それを実際に端末で実行し、その結果をAIに渡して、必要ならまた次のコマンドを考えてもらう……というもの。

  ネックはAIの応答からコマンドを抜き出す方法……なのだが、実はそれはもう解決済み。AIに「JSON形式で答えてね」と指示すればよいのだ。それだけで割と機械処理しやすい形で返ってくる。

  個人的な考えだが、AIに事細かに指示する「プロンプトエンジニアリング」は極めてくだらない取り組みだと思う。自然文での指示が基本なのだから、ごく自然に必要最小限の文で指示をするべきなのだ。AIの種別によっては意図した結果にならなかったり、どのAIを使っても意図した結果にならなかったりするかもしれないが、それはAIの能力の不足であって、いましばらくの進化を待つべきだ。AIが十分に進化すれば「プロンプトエンジニアリング」などは不要になるはずで、そうなればそんな策を弄したような指示は逆に不自然な指示になるだろう。つまるところ「あなたは◯◯の専門家です」というプロンプト。気持ち悪ィんだよ。

  というわけで、作ってみた。やってることは単純。AIにコマンドをJSONで出させて、ssh経由で実行、その結果を渡し、AIにコマンドを……を繰り返すだけ。で「あー、あのー、あれ。ウェブサーバだっけな。起動してないんなら、ちょっと起動しといてくんない?」と、AIに指示した結果がこちら。

/home/user/devel/ngs $ INT=1 ./xopilot
REQ> あー、あのー、あれ。ウェブサーバだっけな。起動してないんなら、ちょっと起動しといてくんない?
コマンド[ssh root@localhost cat /etc/os-release]を実行しますか?
コマンド[ssh root@localhost id]を実行しますか?
================================================================================
Linuxの端末でコマンド「cat /etc/os-release」の実行結果は以下でした。
```
NAME="Fedora Linux"
VERSION="42 (MATE-Compiz)"
RELEASE_TYPE=stable
ID=fedora
VERSION_ID=42
VERSION_CODENAME=""
PLATFORM_ID="platform:f42"
PRETTY_NAME="Fedora Linux 42 (MATE-Compiz)"
ANSI_COLOR="0;38;2;60;110;180"
LOGO=fedora-logo-icon
CPE_NAME="cpe:/o:fedoraproject:fedora:42"
DEFAULT_HOSTNAME="fedora"
HOME_URL="https://fedoraproject.org/"
DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f42/"
SUPPORT_URL="https://ask.fedoraproject.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Fedora"
REDHAT_BUGZILLA_PRODUCT_VERSION=42
REDHAT_SUPPORT_PRODUCT="Fedora"
REDHAT_SUPPORT_PRODUCT_VERSION=42
SUPPORT_END=2026-05-13
VARIANT="MATE-Compiz"
VARIANT_ID=matecompiz
```
Linuxの端末でコマンド「id」の実行結果は以下でした。
```
uid=0(root) gid=0(root) groups=0(root)
```
あー、あのー、あれ。ウェブサーバだっけな。起動してないんなら、ちょっと起動しといてくんない?
コマンドの実行が必要であれば、そのコマンドをJSON形式で指示してください。実行結果を返します。
指示内容を実行できたら「追加のコマンドは必要ありません」と答えてください。
--------------------------------------------------------------------------------
Fedora Linuxにウェブサーバ(Apache HTTP Serverなど)がインストールされている場合、次のコマンドでサービスを起動できます。以下のコマンドをJSON形式で指示します。
 
```json
{
  "command": "systemctl start httpd",
  "description": "Apache HTTP Serverを起動します。"
}
```
 
もしNginxなど別のウェブサーバを使用している場合は、コマンドを変更する必要がありますので、その場合はお知らせください。
--------------------------------------------------------------------------------
コマンド[ssh root@localhost systemctl start httpd]を実行しますか?
================================================================================
指示してもらったコマンド「systemctl start httpd」の実行結果は以下でした。
```
 
```
あー、あのー、あれ。ウェブサーバだっけな。起動してないんなら、ちょっと起動しといてくんない?
コマンドの実行が必要であれば、そのコマンドをJSON形式で指示してください。実行結果を返します。
指示内容を実行できたら「追加のコマンドは必要ありません」と答えてください。
--------------------------------------------------------------------------------
次に、ウェブサーバの状態を確認してみましょう。以下のコマンドを実行してください。
 
```json
{
  "command": "systemctl status httpd",
  "description": "Apache HTTP Serverの状態を確認します。"
}
```
 
これにより、ウェブサーバが起動しているかどうかが確認できます。結果を教えてください。
--------------------------------------------------------------------------------
コマンド[ssh root@localhost systemctl status httpd]を実行しますか?
================================================================================
指示してもらったコマンド「systemctl status httpd」の実行結果は以下でした。
```
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
             /etc/systemd/system/httpd.service.d
             └─override.conf
     Active: active (running) since Tue 2025-08-26 22:48:29 JST; 4s ago
 Invocation: 9638ae5341dd4ad4a36c37ec35333ea1
       Docs: man:httpd.service(8)
   Main PID: 77463 (httpd)
     Status: "Started, listening on: port 80"
      Tasks: 177 (limit: 18293)
     Memory: 13.8M (peak: 15.2M)
        CPU: 127ms
     CGroup: /system.slice/httpd.service
             ├─77463 /usr/sbin/httpd -DFOREGROUND
             ├─77464 /usr/sbin/httpd -DFOREGROUND
             ├─77465 /usr/sbin/httpd -DFOREGROUND
             ├─77466 /usr/sbin/httpd -DFOREGROUND
             └─77467 /usr/sbin/httpd -DFOREGROUND
 
 8月 26 22:48:29 derota.itline.jp systemd[1]: Starting httpd.service - The Apache HTTP Server...
 8月 26 22:48:29 derota.itline.jp (httpd)[77463]: httpd.service: Referenced but unset environment variable evaluates to an empty string: OPTIONS
 8月 26 22:48:29 derota.itline.jp httpd[77463]: Server configured, listening on: port 80
 8月 26 22:48:29 derota.itline.jp systemd[1]: Started httpd.service - The Apache HTTP Server.
```
あー、あのー、あれ。ウェブサーバだっけな。起動してないんなら、ちょっと起動しといてくんない?
コマンドの実行が必要であれば、そのコマンドをJSON形式で指示してください。実行結果を返します。
指示内容を実行できたら「追加のコマンドは必要ありません」と答えてください。
--------------------------------------------------------------------------------
ウェブサーバ(Apache HTTP Server)は既に起動しているようです。実行結果に「Active: active (running)」とあり、ポート80でリッスンしていることが示されています。
 
したがって、追加のコマンドは必要ありません。
--------------------------------------------------------------------------------

  見事に日本語の自然文の指示によりウェブサーバを起動することができている。root権限で実行させる都合から、確認モード(INT=1)を指定しているが、元気があれば自動走行でもできる。

  必要な設定は以下。操作対象のサーバとアカウントはsshのコマンドパラメータとして与える。最初に既定で「cat /etc/os-release」と「id」の実行結果を渡すのは、AIにコマンドの動作環境を知らせるためだ。これは、なかなかのアイデアではないかな。

@configs[:xopilot] = {}
@configs[:xopilot][:ssh_cmd]    = ['ssh', 'localhost']
@configs[:xopilot][:first_cmds] = ['cat /etc/os-release', 'id']
@configs[:xopilot][:result_max] = 64
@configs[:xopilot][:ask_max]    = 20

  あ。ちなみに「XoPilot」というコマンド名は「ゾパイロット」と読む。「Xalebot」の姉妹品であることを暗示しつつ「eXtra Offhand Pilot」を意味しつつ、某マイクソソフトのアレに当てつけた名前でもある。

  なお、全部は紹介しきれないが、指示の達成率はそれなりに高く、以下のような指示を概ねクリアできている。

・時刻同期の状態を教えてください
・ホームディレクトリの下に動画はありますか? あれば、そのリストと、動画の長さを調べてください
・昨日のメールの送受信数を調べてください
・ホームディレクトリの下にhoge.txtというファイルをfuga!という内容で生成してください。
・/etc/hostsにhogeというホストを追加してください。IPアドレスは192.168.0.99です。
・/etc/hostsにhogeというホストがあれば削除してください。
・ホームディレクトリの下に開発物件はありますか? あれば、概要を教えてください。

  XoPilotは自製のngsライブラリのサンプルである。http://itline.jp/git/ngsに置いておく。