add sabagen

This commit is contained in:
Seiji Nakamura
2025-05-12 15:46:04 +09:00
parent ccf21dac76
commit 33284ef5ac
186 changed files with 17145 additions and 0 deletions

125
sabagen.py Normal file
View File

@@ -0,0 +1,125 @@
import tkinter as tk
from tkinter import messagebox, filedialog
import subprocess
import os
CHEAT_SHEET = '''; === SBaGen チートシート ===
; 書式: 時間 左-右 チャンネル オプション
; 例: +0:00:00 400-410 L
; 左400Hz, 右410Hz → 10HzビートL=左基準)
+0:00:00 400-410 L
; 時間経過後の周波数変化10分後に420Hz/430Hzへ
+0:10:00 420-430 L
; 音声終了20分後
+0:20:00 off
; 背景音の追加(最初に記述)
_ = mix(nature.wav, 0.3)
; ノイズを加える(例: white, pink
_ = mix(white, 0.1)
; チャンネル指定:
; L = 左ベース(左耳に指定周波数、右に +差分)
; R = 右ベース
; S = ステレオ完全分離(各耳に別の周波数)
'''
class SBGEditor:
def __init__(self, master):
self.master = master
master.title("SBaGen GUIエディタ環境音対応")
master.geometry("640x580")
self.steps = []
self.env_file = None
self.env_volume = tk.DoubleVar(value=0.3)
self.frame = tk.Frame(master)
self.frame.pack(pady=10)
tk.Label(self.frame, text="時間(+HH:MM:SS").grid(row=0, column=0)
tk.Label(self.frame, text="左耳周波数").grid(row=0, column=1)
tk.Label(self.frame, text="右耳周波数").grid(row=0, column=2)
self.time_entry = tk.Entry(self.frame)
self.left_entry = tk.Entry(self.frame)
self.right_entry = tk.Entry(self.frame)
self.time_entry.grid(row=1, column=0)
self.left_entry.grid(row=1, column=1)
self.right_entry.grid(row=1, column=2)
tk.Button(self.frame, text="追加", command=self.add_step).grid(row=1, column=3, padx=10)
env_frame = tk.LabelFrame(master, text="🔊 環境音の追加mix", padx=10, pady=10)
env_frame.pack(padx=10, pady=10, fill="x")
tk.Button(env_frame, text="環境音を選択WAV/MP3", command=self.select_env_file).pack(pady=5)
tk.Label(env_frame, text="音量:").pack()
tk.Scale(env_frame, from_=0.0, to=1.0, resolution=0.01, variable=self.env_volume, orient="horizontal").pack(fill="x")
self.env_label = tk.Label(env_frame, text="現在: 未選択")
self.env_label.pack()
# スクリプト表示欄
self.script_box = tk.Text(master, height=20)
self.script_box.pack(padx=10, pady=10, fill="both", expand=True)
self.script_box.insert("1.0", CHEAT_SHEET)
btn_frame = tk.Frame(master)
btn_frame.pack(pady=10)
tk.Button(btn_frame, text="💾 保存(.sbg", command=self.save_file, width=20).pack(side="left", padx=10)
tk.Button(btn_frame, text="▶ 再生sbagen", command=self.play_sbagen, width=20).pack(side="right", padx=10)
def add_step(self):
time = self.time_entry.get()
left = self.left_entry.get()
right = self.right_entry.get()
if not (time and left and right):
messagebox.showwarning("未入力", "すべてのフィールドを入力してください。")
return
line = f"{time} {left}-{right} L"
self.script_box.insert("end", line + "\n")
self.steps.append(line)
def select_env_file(self):
file = filedialog.askopenfilename(filetypes=[("音声ファイル", "*.wav *.mp3")])
if file:
self.env_file = file
self.env_label.config(text=f"現在: {os.path.basename(file)}")
def insert_env_mix(self, text_lines):
if self.env_file:
path = os.path.abspath(self.env_file).replace("\\", "/")
mix_line = f"_ = mix({path}, {self.env_volume.get():.2f})"
text_lines.insert(0, mix_line)
return text_lines
def save_file(self):
filename = filedialog.asksaveasfilename(defaultextension=".sbg", filetypes=[("SBaGen Script", "*.sbg")])
if filename:
lines = self.script_box.get("1.0", "end").strip().split("\n")
full_script = self.insert_env_mix(lines)
with open(filename, "w") as f:
f.write("\n".join(full_script))
messagebox.showinfo("保存完了", f"{filename} を保存しました。")
def play_sbagen(self):
lines = self.script_box.get("1.0", "end").strip().split("\n")
full_script = self.insert_env_mix(lines)
with open("temp_play.sbg", "w") as f:
f.write("\n".join(full_script))
try:
subprocess.run(["./sbagen-1.4.5/sbagen", "temp_play.sbg"])
except FileNotFoundError:
messagebox.showerror("再生失敗", "sbagen が見つかりません。パスを確認してください。")
if __name__ == "__main__":
root = tk.Tk()
app = SBGEditor(root)
root.mainloop()