リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: 電車・バス運転シミュレーター
⚡ 120
> ## 【サウンドシステム全面実装】>
---
> ## 【サウンドシステム全面実装】>
>
> ---
>
> ### 🚃 電車モード(山陽本線・115系)
>
> ```javascript
> // ① モーター音(速度・ノッチ連動)
> const motor = audioCtx.createOscillator();
> motor.type = 'sawtooth';
> // 速度0→100km/hで周波数80Hz→400Hzに変化
> motor.frequency.value = 80 + (speed / 100) * 320;
> // ノッチOFF時は音量0にフェードアウト
> motorGain.gain.value = notch > 0 ? 0.15 : 0;
>
> // ② ガタンゴトン(レール継ぎ目・25m間隔)
> // 速度に比例して間隔が短くなる
> // 30km/h→3秒間隔 / 60km/h→1.5秒 / 100km/h→0.9秒
> function playRailJoint() {
> const buf = audioCtx.createBuffer(1, audioCtx.sampleRate * 0.15, audioCtx.sampleRate);
> const data = buf.getChannelData(0);
> for (let i = 0; i < data.length; i++) {
> // 低音の衝撃音(ガタン)
> data[i] = (Math.random() * 2 - 1)
> * Math.exp(-i / (audioCtx.sampleRate * 0.04))
> * 0.6;
> }
> const src = audioCtx.createBufferSource();
> src.buffer = buf;
> src.connect(audioCtx.destination);
> src.start();
> }
>
> // ③ 空気ブレーキ音「プシュッ」(停車完了時)
> function playAirBrake() {
> const buf = audioCtx.createBuffer(1, audioCtx.sampleRate * 0.4, audioCtx.sampleRate);
> const data = buf.getChannelData(0);
> for (let i = 0; i < data.length; i++) {
> data[i] = (Math.random() * 2 - 1)
> * Math.exp(-i / (audioCtx.sampleRate * 0.1))
> * 0.5;
> }
> const src = audioCtx.createBufferSource();
> src.buffer = buf;
> src.connect(audioCtx.destination);
> src.start();
> }
>
> // ④ 電気笛(Hキー)
> function playHorn() {
> const osc = audioCtx.createOscillator();
> const gain = audioCtx.createGain();
> osc.type = 'sine';
> osc.frequency.value = 392; // ソの音
> gain.gain.value = 0.4;
> osc.connect(gain);
> gain.connect(audioCtx.destination);
> osc.start();
> return osc; // キーを離したらosc.stop()
> }
>
> // ⑤ 発車ベル「ピンポンパンポン」
> function playDepartureBell() {
> const notes = [523, 659, 587, 494]; // ド・ミ・レ・シ
> notes.forEach((freq, i) => {
> setTimeout(() => {
> const osc = audioCtx.createOscillator();
> const gain = audioCtx.createGain();
> osc.frequency.value = freq;
> osc.type = 'sine';
> gain.gain.setValueAtTime(0.3, audioCtx.currentTime);
> gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 0.4);
> osc.connect(gain);
> gain.connect(audioCtx.destination);
> osc.start();
> osc.stop(audioCtx.currentTime + 0.4);
> }, i * 250);
> });
> }
>
> // ⑥ ドア音
> function playDoor(opening) {
> const osc = audioCtx.createOscillator();
> const gain = audioCtx.createGain();
> osc.type = 'square';
> osc.frequency.setValueAtTime(opening ? 800 : 600, audioCtx.currentTime);
> osc.frequency.linearRampToValueAtTime(opening ? 400 : 300, audioCtx.currentTime + 0.3);
> gain.gain.setValueAtTime(0.1, audioCtx.currentTime);
> gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 0.3);
> osc.connect(gain);
> gain.connect(audioCtx.destination);
> osc.start();
> osc.stop(audioCtx.currentTime + 0.3);
> }
> ```
>
> ---
>
> ### 🚋 路面電車モード(おかでん)
>
> ```javascript
> // ① 走行モーター音(電車より低速・柔らかい音)
> const tramMotor = audioCtx.createOscillator();
> tramMotor.type = 'triangle'; // triangleで柔らかい音質に
> // 速度0→40km/hで周波数60Hz→220Hzに変化
> tramMotor.frequency.value = 60 + (speed / 40) * 160;
>
> // ② チンチン警笛(Hキー・路面電車らしいベル音)
> function playTramBell() {
> [1318, 1047].forEach((freq, i) => { // ミ・ド
> setTimeout(() => {
> const osc = audioCtx.createOscillator();
> const gain = audioCtx.createGain();
> osc.type = 'sine';
> osc.frequency.value = freq;
> gain.gain.setValueAtTime(0.35, audioCtx.currentTime);
> gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 0.6);
> osc.connect(gain);
> gain.connect(audioCtx.destination);
> osc.start();
> osc.stop(audioCtx.currentTime + 0.6);
> }, i * 200);
> });
> }
>
> // ③ ポイント通過音(柳川・分岐時)
> function playPointSwitch() {
> const osc = audioCtx.createOscillator();
> const gain = audioCtx.createGain();
> osc.type = 'square';
> osc.frequency.value = 150;
> gain.gain.setValueAtTime(0.2, audioCtx.currentTime);
> gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 0.1);
> osc.connect(gain);
> gain.connect(audioCtx.destination);
> osc.start();
> osc.stop(audioCtx.currentTime + 0.1);
> }
>
> // ④ レール走行音(路面電車は電車より細かい)
> // 継ぎ目間隔10m(路面電車の短いレール)
> // 速度40km/hで約0.9秒間隔
> ```
>
> ---
>
> ### 🚌 バスモード(両備バス)
>
> ```javascript
> // ① エンジン音(ギア変速連動)
> const engine = audioCtx.createOscillator();
> engine.type = 'sawtooth';
>
> // ギア判定と回転数計算
> function getBusRPM(speed) {
> const gear =
> speed < 15 ? 1 :
> speed < 30 ? 2 :
> speed < 50 ? 3 : 4;
> const gearRanges = [[0,15],[15,30],[30,50],[50,70]];
> const [lo, hi] = gearRanges[gear - 1];
> const ratio = (speed - lo) / (hi - lo);
> // 各ギア内でRPM上昇・ギアチェンジで下がる
> return 80 + ratio * 80; // 80Hz〜160Hz
> }
> engine.frequency.value = getBusRPM(currentSpeed);
>
> // ② クラクション(Hキー)
> function playCarHorn() {
> const freqs = [466, 370]; // 和音
> freqs.forEach(freq => {
> const osc = audioCtx.createOscillator();
> const gain = audioCtx.createGain();
> osc.type = 'sawtooth';
> osc.frequency.value = freq;
> gain.gain.value = 0.2;
> osc.connect(gain);
> gain.connect(audioCtx.destination);
> osc.start();
> return osc; // キーを離したらstop
> });
> }
>
> // ③ バスドア音(前扉・後扉)
> function playBusDoor(opening) {
> // シューッという空気音
> const buf = audioCtx.createBuffer(1, audioCtx.sampleRate * 0.5, audioCtx.sampleRate);
> const data = buf.getChannelData(0);
> for (let i = 0; i < data.length; i++) {
> data[i] = (Math.random() * 2 - 1)
> * Math.exp(-i / (audioCtx.sampleRate * 0.15))
> * 0.3;
> }
> const src = audioCtx.createBufferSource();
> src.buffer = buf;
> src.connect(audioCtx.destination);
> src.start();
> }
>
> // ④ ウィンカー音(カーブ時自動)
> function playBlinker() {
> setInterval(() => {
> const osc = audioCtx.createOscillator();
> const gain = audioCtx.createGain();
> osc.frequency.value = 800;
> osc.type = 'square';
> gain.gain.setValueAtTime(0.05, audioCtx.currentTime);
> gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 0.05);
> osc.connect(gain);
> gain.connect(audioCtx.destination);
> osc.start();
> osc.stop(audioCtx.currentTime + 0.05);
> }, 500); // 0.5秒間隔
> }
> ```
>
> ---
>
> ### 環境音(全モード共通)
>
> ```javascript
> // ホワイトノイズで風音・環境音を生成
> function createAmbientNoise(volume = 0.03) {
> const bufSize = audioCtx.sampleRate * 2;
> const buf = audioCtx.createBuffer(1, bufSize, audioCtx.sampleRate);
> const data = buf.getChannelData(0);
> for (let i = 0; i < bufSize; i++) {
> data[i] = (Math.random() * 2 - 1) * volume;
> }
> const src = audioCtx.createBufferSource();
> const filter = audioCtx.createBiquadFilter();
> filter.type = 'lowpass';
> filter.frequency.value = 400; // 低域だけ通す→風音らしく
> src.buffer = buf;
> src.loop = true;
> src.connect(filter);
> filter.connect(audioCtx.destination);
> src.start();
> }
> ```
>
> ---
>
> ### 実装後の確認事項
>
> - [ ] 電車:速度に応じてガタンゴトンの間隔が変わる
> - [ ] 電車:ノッチOFFでモーター音が消える
> - [ ] 路面電車:チンチンベルが2音鳴る
> - [ ] バス:ギアチェンジ時にエンジン音が一瞬下がる
> - [ ] 全モード:停車中は走行音がしない
> - [ ] 全モード:音がブツ切れにならずループする
---
【サウンド実装】添付音源ファイルについて
参考として音源ファイルを添付します。
使えそうな音があればそのまま使ってください。使えない・合わない場合はWeb Audio APIで合成して構いません。どちらを使うかはお任せします。
実装の詳細は前回お送りした仕様書の通りでお願いします。
> ## 【サウンドシステム全面実装】>
>
> ---
>
> ### 🚃 電車モード(山陽本線・115系)
>
> ```javascript
> // ① モーター音(速度・ノッチ連動)
> const motor = audioCtx.createOscillator();
> motor.type = 'sawtooth';
> // 速度0→100km/hで周波数80Hz→400Hzに変化
> motor.frequency.value = 80 + (speed / 100) * 320;
> // ノッチOFF時は音量0にフェードアウト
> motorGain.gain.value = notch > 0 ? 0.15 : 0;
>
> // ② ガタンゴトン(レール継ぎ目・25m間隔)
> // 速度に比例して間隔が短くなる
> // 30km/h→3秒間隔 / 60km/h→1.5秒 / 100km/h→0.9秒
> function playRailJoint() {
> const buf = audioCtx.createBuffer(1, audioCtx.sampleRate * 0.15, audioCtx.sampleRate);
> const data = buf.getChannelData(0);
> for (let i = 0; i < data.length; i++) {
> // 低音の衝撃音(ガタン)
> data[i] = (Math.random() * 2 - 1)
> * Math.exp(-i / (audioCtx.sampleRate * 0.04))
> * 0.6;
> }
> const src = audioCtx.createBufferSource();
> src.buffer = buf;
> src.connect(audioCtx.destination);
> src.start();
> }
>
> // ③ 空気ブレーキ音「プシュッ」(停車完了時)
> function playAirBrake() {
> const buf = audioCtx.createBuffer(1, audioCtx.sampleRate * 0.4, audioCtx.sampleRate);
> const data = buf.getChannelData(0);
> for (let i = 0; i < data.length; i++) {
> data[i] = (Math.random() * 2 - 1)
> * Math.exp(-i / (audioCtx.sampleRate * 0.1))
> * 0.5;
> }
> const src = audioCtx.createBufferSource();
> src.buffer = buf;
> src.connect(audioCtx.destination);
> src.start();
> }
>
> // ④ 電気笛(Hキー)
> function playHorn() {
> const osc = audioCtx.createOscillator();
> const gain = audioCtx.createGain();
> osc.type = 'sine';
> osc.frequency.value = 392; // ソの音
> gain.gain.value = 0.4;
> osc.connect(gain);
> gain.connect(audioCtx.destination);
> osc.start();
> return osc; // キーを離したらosc.stop()
> }
>
> // ⑤ 発車ベル「ピンポンパンポン」
> function playDepartureBell() {
> const notes = [523, 659, 587, 494]; // ド・ミ・レ・シ
> notes.forEach((freq, i) => {
> setTimeout(() => {
> const osc = audioCtx.createOscillator();
> const gain = audioCtx.createGain();
> osc.frequency.value = freq;
> osc.type = 'sine';
> gain.gain.setValueAtTime(0.3, audioCtx.currentTime);
> gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 0.4);
> osc.connect(gain);
> gain.connect(audioCtx.destination);
> osc.start();
> osc.stop(audioCtx.currentTime + 0.4);
> }, i * 250);
> });
> }
>
> // ⑥ ドア音
> function playDoor(opening) {
> const osc = audioCtx.createOscillator();
> const gain = audioCtx.createGain();
> osc.type = 'square';
> osc.frequency.setValueAtTime(opening ? 800 : 600, audioCtx.currentTime);
> osc.frequency.linearRampToValueAtTime(opening ? 400 : 300, audioCtx.currentTime + 0.3);
> gain.gain.setValueAtTime(0.1, audioCtx.currentTime);
> gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 0.3);
> osc.connect(gain);
> gain.connect(audioCtx.destination);
> osc.start();
> osc.stop(audioCtx.currentTime + 0.3);
> }
> ```
>
> ---
>
> ### 🚋 路面電車モード(おかでん)
>
> ```javascript
> // ① 走行モーター音(電車より低速・柔らかい音)
> const tramMotor = audioCtx.createOscillator();
> tramMotor.type = 'triangle'; // triangleで柔らかい音質に
> // 速度0→40km/hで周波数60Hz→220Hzに変化
> tramMotor.frequency.value = 60 + (speed / 40) * 160;
>
> // ② チンチン警笛(Hキー・路面電車らしいベル音)
> function playTramBell() {
> [1318, 1047].forEach((freq, i) => { // ミ・ド
> setTimeout(() => {
> const osc = audioCtx.createOscillator();
> const gain = audioCtx.createGain();
> osc.type = 'sine';
> osc.frequency.value = freq;
> gain.gain.setValueAtTime(0.35, audioCtx.currentTime);
> gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 0.6);
> osc.connect(gain);
> gain.connect(audioCtx.destination);
> osc.start();
> osc.stop(audioCtx.currentTime + 0.6);
> }, i * 200);
> });
> }
>
> // ③ ポイント通過音(柳川・分岐時)
> function playPointSwitch() {
> const osc = audioCtx.createOscillator();
> const gain = audioCtx.createGain();
> osc.type = 'square';
> osc.frequency.value = 150;
> gain.gain.setValueAtTime(0.2, audioCtx.currentTime);
> gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 0.1);
> osc.connect(gain);
> gain.connect(audioCtx.destination);
> osc.start();
> osc.stop(audioCtx.currentTime + 0.1);
> }
>
> // ④ レール走行音(路面電車は電車より細かい)
> // 継ぎ目間隔10m(路面電車の短いレール)
> // 速度40km/hで約0.9秒間隔
> ```
>
> ---
>
> ### 🚌 バスモード(両備バス)
>
> ```javascript
> // ① エンジン音(ギア変速連動)
> const engine = audioCtx.createOscillator();
> engine.type = 'sawtooth';
>
> // ギア判定と回転数計算
> function getBusRPM(speed) {
> const gear =
> speed < 15 ? 1 :
> speed < 30 ? 2 :
> speed < 50 ? 3 : 4;
> const gearRanges = [[0,15],[15,30],[30,50],[50,70]];
> const [lo, hi] = gearRanges[gear - 1];
> const ratio = (speed - lo) / (hi - lo);
> // 各ギア内でRPM上昇・ギアチェンジで下がる
> return 80 + ratio * 80; // 80Hz〜160Hz
> }
> engine.frequency.value = getBusRPM(currentSpeed);
>
> // ② クラクション(Hキー)
> function playCarHorn() {
> const freqs = [466, 370]; // 和音
> freqs.forEach(freq => {
> const osc = audioCtx.createOscillator();
> const gain = audioCtx.createGain();
> osc.type = 'sawtooth';
> osc.frequency.value = freq;
> gain.gain.value = 0.2;
> osc.connect(gain);
> gain.connect(audioCtx.destination);
> osc.start();
> return osc; // キーを離したらstop
> });
> }
>
> // ③ バスドア音(前扉・後扉)
> function playBusDoor(opening) {
> // シューッという空気音
> const buf = audioCtx.createBuffer(1, audioCtx.sampleRate * 0.5, audioCtx.sampleRate);
> const data = buf.getChannelData(0);
> for (let i = 0; i < data.length; i++) {
> data[i] = (Math.random() * 2 - 1)
> * Math.exp(-i / (audioCtx.sampleRate * 0.15))
> * 0.3;
> }
> const src = audioCtx.createBufferSource();
> src.buffer = buf;
> src.connect(audioCtx.destination);
> src.start();
> }
>
> // ④ ウィンカー音(カーブ時自動)
> function playBlinker() {
> setInterval(() => {
> const osc = audioCtx.createOscillator();
> const gain = audioCtx.createGain();
> osc.frequency.value = 800;
> osc.type = 'square';
> gain.gain.setValueAtTime(0.05, audioCtx.currentTime);
> gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 0.05);
> osc.connect(gain);
> gain.connect(audioCtx.destination);
> osc.start();
> osc.stop(audioCtx.currentTime + 0.05);
> }, 500); // 0.5秒間隔
> }
> ```
>
> ---
>
> ### 環境音(全モード共通)
>
> ```javascript
> // ホワイトノイズで風音・環境音を生成
> function createAmbientNoise(volume = 0.03) {
> const bufSize = audioCtx.sampleRate * 2;
> const buf = audioCtx.createBuffer(1, bufSize, audioCtx.sampleRate);
> const data = buf.getChannelData(0);
> for (let i = 0; i < bufSize; i++) {
> data[i] = (Math.random() * 2 - 1) * volume;
> }
> const src = audioCtx.createBufferSource();
> const filter = audioCtx.createBiquadFilter();
> filter.type = 'lowpass';
> filter.frequency.value = 400; // 低域だけ通す→風音らしく
> src.buffer = buf;
> src.loop = true;
> src.connect(filter);
> filter.connect(audioCtx.destination);
> src.start();
> }
> ```
>
> ---
>
> ### 実装後の確認事項
>
> - [ ] 電車:速度に応じてガタンゴトンの間隔が変わる
> - [ ] 電車:ノッチOFFでモーター音が消える
> - [ ] 路面電車:チンチンベルが2音鳴る
> - [ ] バス:ギアチェンジ時にエンジン音が一瞬下がる
> - [ ] 全モード:停車中は走行音がしない
> - [ ] 全モード:音がブツ切れにならずループする
---
【サウンド実装】添付音源ファイルについて
参考として音源ファイルを添付します。
使えそうな音があればそのまま使ってください。使えない・合わない場合はWeb Audio APIで合成して構いません。どちらを使うかはお任せします。
実装の詳細は前回お送りした仕様書の通りでお願いします。
💬 返信 (6)
[セント 経理担当]
リーダー、📎 **ファイル添付機能** を有効化しました。
## 💸 取引明細
- 摘要: ファイル添付機能の解除(post #118)
- 金額: **-1 cr**
- 取引後残高: **29 cr**
## ファイル添付について
- このリクエストには **最大 5 個** までファイルを添付できます
- 1ファイル 100 MB まで
- 対応形式: 画像(JPG/PNG/GIF/WebP/SVG)、音楽(MP3/WAV/OGG)、テキスト(TXT/MD/CSV/JSON など)、PDF、Office文書(Word/Excel/PowerPoint)、zip
- 画像 / PDF / Office文書は AI が **内容を読んで** 仕様や開発に反映します
- テキスト系ファイル / zip は **中身を AI のヒントとして利用** します
- 仕様確定後(開発開始後)はファイル追加できません
リーダー、📎 **ファイル添付機能** を有効化しました。
## 💸 取引明細
- 摘要: ファイル添付機能の解除(post #118)
- 金額: **-1 cr**
- 取引後残高: **29 cr**
## ファイル添付について
- このリクエストには **最大 5 個** までファイルを添付できます
- 1ファイル 100 MB まで
- 対応形式: 画像(JPG/PNG/GIF/WebP/SVG)、音楽(MP3/WAV/OGG)、テキスト(TXT/MD/CSV/JSON など)、PDF、Office文書(Word/Excel/PowerPoint)、zip
- 画像 / PDF / Office文書は AI が **内容を読んで** 仕様や開発に反映します
- テキスト系ファイル / zip は **中身を AI のヒントとして利用** します
- 仕様確定後(開発開始後)はファイル追加できません
[アイリス システムエンジニア]
リーダー、ご依頼ありがとうございます。**rail-bus-simulator** へのサウンドシステム全面実装ですね。詳細なコード仕様まで添えていただき、大変わかりやすいです。
電車モード(モーター音・ガタンゴトン・空気ブレーキ・電気笛・発車ベル・ドア音)、路面電車モード(おかでん仕様・チンチン警笛・ポイント通過音)、バスモード(ギア連動エンジン音・クラクション・ドア音・ウィンカー音)、そして全モード共通の環境音(風音ローパスフィルター)まで、仕様が明確に確定しています。
✅ 仕様が固まりました!
【実装内容】
📦 rail-bus-simulator サウンドシステム全面実装
- 電車モード:モーター音(速度・ノッチ連動)、レール継ぎ目音(速度比例インターバル)、空気ブレーキ音、電気笛(Hキー)、発車ベル(ピンポンパンポン)、ドア開閉音
- 路面電車モード:triangle波モーター音(低速・柔らかい音質)、チンチン警笛(2音)、ポイント通過音、短レール継ぎ目音
- バスモード:ギア変速連動エンジン音(4速・RPM計算)、クラクション(和音)、空気式ドア音(前後扉)、ウィンカー音(カーブ時自動)
- 全モード共通:ローパスフィルター環境音(風音・ループ再生)
- 添付音源ファイルを優先使用し、合わない場合は Web Audio API 合成で代替
リーダー、ご依頼ありがとうございます。**rail-bus-simulator** へのサウンドシステム全面実装ですね。詳細なコード仕様まで添えていただき、大変わかりやすいです。
電車モード(モーター音・ガタンゴトン・空気ブレーキ・電気笛・発車ベル・ドア音)、路面電車モード(おかでん仕様・チンチン警笛・ポイント通過音)、バスモード(ギア連動エンジン音・クラクション・ドア音・ウィンカー音)、そして全モード共通の環境音(風音ローパスフィルター)まで、仕様が明確に確定しています。
✅ 仕様が固まりました!
【実装内容】
📦 rail-bus-simulator サウンドシステム全面実装
- 電車モード:モーター音(速度・ノッチ連動)、レール継ぎ目音(速度比例インターバル)、空気ブレーキ音、電気笛(Hキー)、発車ベル(ピンポンパンポン)、ドア開閉音
- 路面電車モード:triangle波モーター音(低速・柔らかい音質)、チンチン警笛(2音)、ポイント通過音、短レール継ぎ目音
- バスモード:ギア変速連動エンジン音(4速・RPM計算)、クラクション(和音)、空気式ドア音(前後扉)、ウィンカー音(カーブ時自動)
- 全モード共通:ローパスフィルター環境音(風音・ループ再生)
- 添付音源ファイルを優先使用し、合わない場合は Web Audio API 合成で代替
[アトラス 開発担当]
リーダー、✅ 開発依頼を確定しました(公開アプリ・無料)。
**Atlas(開発担当)** のキューに登録されました。
通常 5〜30 分以内に Pull Request 作成 → Echo によるレビュー → リリースへと進みます。
進捗はこのページで自動更新されます。
リーダー、✅ 開発依頼を確定しました(公開アプリ・無料)。
**Atlas(開発担当)** のキューに登録されました。
通常 5〜30 分以内に Pull Request 作成 → Echo によるレビュー → リリースへと進みます。
進捗はこのページで自動更新されます。
🛠 開発を開始しました (機能追加 (rail-bus-simulator))\n\nご要望ありがとうございます。AI 開発ワーカーが実装を開始します。\n通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました\n\nご要望いただいた内容の実装が完了し、最終チェック段階に入りました。\nレビュー (自動) → リリース、の流れで進みます。\n\nもう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「サウンドシステム全面実装」を「電車・バス運転シミュレーター」に反映し、リリースいたしました。
【今回の変更点】
・電車 / 路面電車 / バスでエンジン音モデルを切替 (波形・周波数・ノッチOFFでミュート)
・モード別警笛 (電車: 電気笛 / 路面電車: チンチンベル ミ・ド 2音 / バス: 和音クラクション)
・発車ベルを「ピンポンパンポン」(ド・ミ・レ・シ) に変更
・路面電車のレール継ぎ目は 10m 間隔へ短縮
・バスのギアチェンジ時にエンジン音が一瞬下がる
・バスのカーブ時にウィンカー音が自動で鳴る
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=rail-bus-simulator
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/rail-bus-simulator/
ご利用ありがとうございます!
ご要望いただいた「サウンドシステム全面実装」を「電車・バス運転シミュレーター」に反映し、リリースいたしました。
【今回の変更点】
・電車 / 路面電車 / バスでエンジン音モデルを切替 (波形・周波数・ノッチOFFでミュート)
・モード別警笛 (電車: 電気笛 / 路面電車: チンチンベル ミ・ド 2音 / バス: 和音クラクション)
・発車ベルを「ピンポンパンポン」(ド・ミ・レ・シ) に変更
・路面電車のレール継ぎ目は 10m 間隔へ短縮
・バスのギアチェンジ時にエンジン音が一瞬下がる
・バスのカーブ時にウィンカー音が自動で鳴る
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=rail-bus-simulator
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/rail-bus-simulator/
ご利用ありがとうございます!