056 即席オーケストラ

主な迷い: 隣同士に置いて拍をずらすか、空席を挟んで元のリズムを残すか。
自作の短い八ステップ譜面を、五席の配置で組み替えます。
「よい音」や多人数に加点する採点はありません。依頼条件が今回の目標です。
実装・機能検証。人の面白さ確認は未実施。クラウドの音声出力・実聴・音質は未確認。

起動
Windows: 全フォルダを展開しsetup.batを実行、その後play.bat。
Python3.10以上と初回インターネット接続が必要です。Windows実機は未検証。
Linux/macOS: bash setup.sh / bash play.sh。macOS実機は未検証。
依存はPyxel2.9.9と標準ライブラリのみ。日本語glyphを同梱しています。

操作
左右: 五つの席。上下: 太鼓K・鈴B・笛F・低音U・空席から選択。
Z: 配置。選んだ奏者が別席にいればその二席を交換。複製しません。
空席を選んでZ: その席を控えに戻します。各奏者は一人だけです。
X: 配置を一決定戻す。試奏中のundoも次の小節頭へ予約します。
SPACE: 自由試奏/停止。少人数・空の構成も試奏できます。
ENTER: 現構成を三人以上で本番にし、八ステップを四周演奏。
本番中は配置を固定。SPACEで中断して直せます。未達でも再配置できます。
P: 時計と発音を停止し説明。再開は同じ小節の頭から一秒カウントして同期。
R: 同じ曲を初期配置へ。1/2/3: 検証済みの三曲。H: 表紙。ESC: 終了。
M: 消音切替。消音しても譜面・合図・判定・時計は同じです。
S: recordsに現在の曲、配置、全意味入力、論理tickと発音hashをUTF-8保存。
B: 隣接合図だけ効果ゼロにする一変更比較。同じ曲の初期配置へ戻ります。

ルール
太鼓Kは右隣の発音を+1、鈴Bは左隣を-1ステップ。空席越しには届きません。
笛Fと低音Uは合図を出しません。両側の合図は相殺します。
元譜へ一度だけ合計しmod8。ずらした結果から連鎖しません。
音符と音高はペアで移動します。笛の最初の音が7へ移れば、その音高も7へ。
編集内容は演奏中の小節を書換えず、次の小節頭で確定します。
予約中は上に予約席と予測条件、下に現在鳴っている構成の譜面を同時表示。
未確定の選択についても「Z後の予測」に全員休符数と最大同時数を表示します。
薄い元譜、形つき確定音符、音高表記、現在ステップ線、発音中の楽器形があります。
丸=太鼓、三角=鈴、四角=笛、縦棒=低音。色だけで区別しません。

音と時計
30fps、十論理frameで一ステップ、八ステップで80frame、四分音符90BPM相当。
譜面は科学的音高表記。PyxelはA2=440Hzのため、有音程楽器はオクターブを2引いて変換。
太鼓c1はノイズ用の指定で、音程表記とは別です。
K/B/F/Uに固定0/1/2/3チャンネル。Pyxelの内蔵ノイズ・波形だけを使用。
低音量2、短い単音。論理イベントの正確さは検査していますが、実聴はしていません。
実機の音切れ・音量バランス・心地よさは未評価。映像は意図的に無音です。
全譜面の視覚表記はNOTATION.txt。既存曲・外部音源は使用していません。

曲bankと再生
A-01-v1 夕方の広場 / B-01-v1 入りを待つ笛 / C-01-v1 こたえの余白。
有限の自作三譜面です。配置を変えただけのものを新曲として数えません。
各曲360配置（3人240、4人120）を列挙し、合格例を複数保存。
任意seedはありません。純粋State/step、描画と音の出力は別です。乱数なし。
記録には正規化JSONのSHA-256、全曲データ、ルール/生成版、合図有無、tick、終了状態を保存。
python tools/replay_record.py records/A-01-v1.json で照合。相違は理由付きで拒否。
環境のPython/Pyxel版はメタデータ。版が違うだけで拒否する検査ではありません。
論理イベントは各frame最大4個と累積hashで保持し、長い試奏でも音符配列は肥大しません。
画面の小節数は9999+で省略、記録には正確な値を保持します。

比較の範囲
Bの合図効果ゼロでは元の笛が1/3/5/7なので、笛0/4の依頼は成立しません。
その不可能な依頼を難度・面白さの比較にしません。
共通目標は「三人で四小節を演奏」。同じ配置で入り方・休符数・同時数を観察します。

確認
python -m unittest -v / python experiments.py は開発試験。
mediaは実Pyxelの自動操作・無音の紹介映像。native操作は別ログです。
元GIF全frameを順に一度ずつ30fpsへ変換し、音声なしと尺をffprobeで検証。
テストはcapture/native証拠を上書きせず、最終検査で前後のhashを比較。
Pillow・ffmpegはtoolsの制作補助だけに必要。ゲーム起動には不要です。

補足
launch.shはplay.shと同じ相対パス起動の別名です。
Sの保存済み表示は停止画面で確認しました。演奏中・結果画面は状態文が優先されます。
実入力の範囲はmedia/NATIVE_OBSERVATIONS.txt、映像の出所はmedia/MEDIA_PROVENANCE.txt。
素材とライセンスはassets/ASSET_SOURCES.txtに一覧化しています。
