Compare commits
4 Commits
1378c9991c
...
be0f08329b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
be0f08329b | ||
|
|
146b0f3dc3 | ||
|
|
d8b3b8b240 | ||
|
|
0ff9596e97 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1 +1 @@
|
|||||||
.vscode/sftp.json
|
.DS_Store
|
||||||
|
|||||||
@@ -35,4 +35,20 @@
|
|||||||
|
|
||||||
* **Filter Type**: `.ftype(2)` を指定することで、TB-303 のような鋭い(ピキピキした)フィルターサウンドになる。
|
* **Filter Type**: `.ftype(2)` を指定することで、TB-303 のような鋭い(ピキピキした)フィルターサウンドになる。
|
||||||
* **Resonance Modulation**: `lpq` (レゾナンス) も `sine` などで変化させると、より表情豊かなアシッドラインになる。
|
* **Resonance Modulation**: `lpq` (レゾナンス) も `sine` などで変化させると、より表情豊かなアシッドラインになる。
|
||||||
* **OK**: `.ftype(2).lpf(sine.range(300, 3000).slow(8)).lpq(sine.range(15, 30).slow(4))`
|
## 5. Syntax & Preferred Styles (Updated 2026)
|
||||||
|
Strudel の構文とスタイルの最新ルール。
|
||||||
|
|
||||||
|
### `$: ` (Output Operator) の正しい使い方
|
||||||
|
* **ルール**: `$:` は各トラック(パターン)の**先頭にのみ**置くこと。
|
||||||
|
* **NG**: `$: s("bd*4").$.gain(0.8)` (途中に `$.` を挟むのは冗長)
|
||||||
|
* **OK**: `$: s("bd*4").gain(0.8)`
|
||||||
|
|
||||||
|
### 短縮記法 (Short-hand functions) の優先
|
||||||
|
* **ルール**: `delayfeedback` よりも `delayfb` のような短縮記法を優先して使用すること。ライブコーディングらしい簡潔さを保つため。
|
||||||
|
* **数値の省略**: `0.5` や `0.25` のような数値は、キーストロークを減らすために `0` を省略して `.5` や `.25` と表記すること。
|
||||||
|
* **例**: `.delayfb(.5)`, `.gain(.8)`, `.dist(.4)`
|
||||||
|
|
||||||
|
### `dist()` (Distortion) の使用
|
||||||
|
* **ルール**: `shape()` は非推奨。歪みを加えたい場合は `dist()` (または `distort()`) を使用すること。
|
||||||
|
* **NG**: `.shape(0.4)`
|
||||||
|
* **OK**: `.dist(0.4)`
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
Genre: テクノ / ハウス (Tech House)
|
|
||||||
Description: このStrudelコードは、ドラムパターン、ベースライン、そしてシンセのメロディを組み合わせたテックハウス風のトラックを生成します。Perlinノイズによるフィルターとゲインのモジュレーションが、サウンドに動きと深さをもたらしています。
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
setcps(136/60/4); // BPM 136に合わせてサイクルレートを設定
|
|
||||||
|
|
||||||
// メロディックなシンセパターン
|
|
||||||
// supersawとPerlinノイズによるLFOでフィルターを動かし、音に揺らぎを与えています。
|
|
||||||
$:note("[- c2 - c2 - [c2|c5] - c2]") // ノートパターンを定義。ランダムなオクターブを挿入。
|
|
||||||
.sound("supersaw") // 厚みのあるsupersaw波形を使用
|
|
||||||
.lpf(perlin.range(400,800).slow(2)) // Perlinノイズでローパスフィルターの周波数をモジュレーション
|
|
||||||
.lpq("[0|10]") // ローパスフィルターのレゾナンスをパターンで切り替え
|
|
||||||
.transpose("[0|0|1]") // ランダムに半音上げることでバリエーションを追加
|
|
||||||
.gain(perlin.range(0.4,0.6).slow(2)); // Perlinノイズでゲインをモジュレーションし、音量に動きを与える
|
|
||||||
|
|
||||||
// ドラムパターン
|
|
||||||
// wchooseCyclesを使って、ドラムサウンドをランダムに選択・重み付けしています。
|
|
||||||
// tr606ドラムマシンを使用し、ディストーションとフィルターでキャラクターを付与。
|
|
||||||
let snd = wchooseCycles(["bd",3], ["hh?",7], ["cr",1]); // バスドラム、ハイハット、クラッシュシンバルを重み付けして選択
|
|
||||||
let snd2 = wchooseCycles(["ht",2], ["lt",1], ["sd",1]); // タムやスネアを重み付けして選択
|
|
||||||
$:stack( // 複数のドラムパターンを重ねて同時に再生
|
|
||||||
|
|
||||||
sound(snd).fast(8).decay(0.5), // ドラムサウンド1を速く再生し、短いディケイを設定
|
|
||||||
sound(snd2).fast(8) // ドラムサウンド2を速く再生
|
|
||||||
.lpf("<900 800 700>") // ローパスフィルターの周波数をパターンで変化
|
|
||||||
.lpq("0 20 30") // ローパスフィルターのレゾナンスをパターンで変化
|
|
||||||
.degradeBy(0.5) // サウンドを少し劣化させて粗さを加える
|
|
||||||
.gain(perlin.range(0.4,0.9).slow(2)) // Perlinノイズでゲインをモジュレーション
|
|
||||||
).bank("tr606"); // Roland TR-606ドラムマシンサウンドバンクを使用
|
|
||||||
|
|
||||||
// ハイハットの構造的なパターン
|
|
||||||
// binaryNとirandを使って、複雑でランダムなハイハットの構造パターンを生成します。
|
|
||||||
$:sound("hh") // ハイハットサウンド
|
|
||||||
.struct(binaryN(irand(15),4)); // ランダムなバイナリ構造でパターンを生成
|
|
||||||
```
|
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
# Deep Ambient & Industrial Textures Template
|
||||||
|
|
||||||
|
ボクが君のために用意した、深みのあるテクスチャを重視した2つのパターンだよ。キーストロークを極限まで削ぎ落とした、プロフェッショナルなライブコーディング・スタイルに仕上げてある。
|
||||||
|
|
||||||
|
## Pattern A: Deep Fluid (深海への没入)
|
||||||
|
リバーブの中に溶け込むような、たゆたうテクスチャを多層的に重ねたスタイル。
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
setcps(126/60/4)
|
||||||
|
|
||||||
|
// 1. Kick & Rumble (重心)
|
||||||
|
// キックに深いリバーブとディレイ、LPFをかけて地鳴りのような質感を出す
|
||||||
|
$: s("bd*4").gain(.8)
|
||||||
|
$: s("bd*4").rev(.5).lpf(180).gain(.4).delay(.5).delayfb(.4)
|
||||||
|
|
||||||
|
// 2. Subbass (脈動)
|
||||||
|
// サイン波によるピュアなサブベース
|
||||||
|
$: n("c1*4").s("sine").lpf(100).gain(sine.range(.2, .4).slow(8))
|
||||||
|
|
||||||
|
// 3. Fluid Texture (流動的な層)
|
||||||
|
// ゆっくりと動くフィルターと深い残響によるドローン
|
||||||
|
$: n("c3 [g3 eb3] c4").s("sine")
|
||||||
|
.lpf(sine.range(300, 1200).slow(16))
|
||||||
|
.rev(.8).delay(.75).delayfb(.6)
|
||||||
|
.gain(sine.range(.05, .15).slow(12))
|
||||||
|
|
||||||
|
// 4. Organic Grain (有機的な粒子)
|
||||||
|
// 定位を揺らしたノイズによる粒子のテクスチャ
|
||||||
|
$: s("white*16").gain(osc(8).range(0, .12))
|
||||||
|
.lpf(sine.range(800, 3000).slow(20))
|
||||||
|
.pan(sine.slow(4))
|
||||||
|
.rev(.4)
|
||||||
|
|
||||||
|
// 5. Subtle Percussion
|
||||||
|
// 高域のみを薄く鳴らすハイハット
|
||||||
|
$: s("hh*16").gain(osc(4).range(0, .25)).hpf(6000)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pattern B: Industrial Pulse (工場の深部)
|
||||||
|
金属的な質感と、規則的ながらも予測不能なリズムのテクスチャを強調したスタイル。
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
setcps(126/60/4)
|
||||||
|
|
||||||
|
// 1. Kick & Rumble (重心)
|
||||||
|
$: s("bd*4").gain(.8)
|
||||||
|
$: s("bd*4").rev(.3).lpf(200).gain(.4).delay(.25).delayfb(.3)
|
||||||
|
|
||||||
|
// 2. Subbass (脈動)
|
||||||
|
$: n("c1*4").s("sine").lpf(100).gain(sine.range(.2, .4).slow(4))
|
||||||
|
|
||||||
|
// 3. Resonant Pulse (共鳴するパルス)
|
||||||
|
// 強いレゾナンスをかけたノイズによるポリリズム的なパルス
|
||||||
|
$: s("white").struct("1 0 0 1 0 1 1 0 0 1 0 0 1 0 1 1")
|
||||||
|
.lpq(35).lpf(sine.range(400, 1500).slow(8))
|
||||||
|
.dist(.4)
|
||||||
|
.gain(.15).rev(.3)
|
||||||
|
|
||||||
|
// 4. Metallic Scrape (金属的な摩擦音)
|
||||||
|
// 高域のノイズを加工した、インダストリアルな響き
|
||||||
|
$: s("white*8").hpf(4000).lpq(20)
|
||||||
|
.gain(osc(2).range(0, .1).phase(.25))
|
||||||
|
.delay(.125).delayfb(.5)
|
||||||
|
.gain(.08)
|
||||||
|
|
||||||
|
// 5. Subtle Percussion
|
||||||
|
$: s("hh*16").gain(osc(4).range(0, .2)).hpf(5000)
|
||||||
|
```
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# パイプの途中でエラーが発生した場合も終了ステータスに反映させる
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
# スクリプトの場所 (scripts/) からプロジェクトルート (notebook/) を動的に取得
|
|
||||||
BASE_DIR=$(cd "$(dirname "$0")/.." && pwd)
|
|
||||||
OUTPUT_DIR="$BASE_DIR/explained"
|
|
||||||
SKILL_FILE="$BASE_DIR/.gemini/skills/strudel_fix_and_explain.md"
|
|
||||||
GEMINI_REF="$BASE_DIR/gemini.md"
|
|
||||||
STRUDEL_REF="$BASE_DIR/.gemini/reference.md"
|
|
||||||
|
|
||||||
# 出力先フォルダの作成
|
|
||||||
if [ ! -f "$SKILL_FILE" ]; then
|
|
||||||
echo "Error: Skill file not found at $SKILL_FILE"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p "$OUTPUT_DIR"
|
|
||||||
|
|
||||||
# ファイルが見つからない場合にワイルドカードをそのまま展開しない設定
|
|
||||||
shopt -s nullglob
|
|
||||||
|
|
||||||
# 引数がある場合はそれを使用し、ない場合は strudel/ フォルダの全mdファイルを対象にする
|
|
||||||
if [ $# -gt 0 ]; then
|
|
||||||
files=("$@")
|
|
||||||
else
|
|
||||||
files=("$BASE_DIR/strudel"/*.md)
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Strudel Fix & Explain Skill started..."
|
|
||||||
|
|
||||||
for file in "${files[@]}"; do
|
|
||||||
# 除外設定
|
|
||||||
[ -f "$file" ] || continue
|
|
||||||
|
|
||||||
filename=$(basename "$file")
|
|
||||||
# 特定のファイルやディレクトリを除外
|
|
||||||
[[ "$filename" =~ ^(Strudel Making Sound|Strudel Study)\.md$ ]] && continue
|
|
||||||
|
|
||||||
# 絶対パスに変換して除外ディレクトリに含まれていないかチェック
|
|
||||||
abs_path=$(realpath "$file")
|
|
||||||
[[ "$abs_path" =~ /($OUTPUT_DIR|refactoring|script)/ ]] && continue
|
|
||||||
|
|
||||||
echo "Analyzing and fixing $filename..."
|
|
||||||
|
|
||||||
# 一時ファイルに出力
|
|
||||||
tmp_file="$OUTPUT_DIR/tmp_$filename"
|
|
||||||
|
|
||||||
# ファイルを引数として直接渡す(STRUDEL_REFも必要ならここに追加)
|
|
||||||
if ! gemini "$GEMINI_REF" "$STRUDEL_REF" "$SKILL_FILE" "$file" > "$tmp_file"; then
|
|
||||||
echo "Error: Gemini CLI failed to process $filename"
|
|
||||||
rm -f "$tmp_file"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ファイルが空でないか確認
|
|
||||||
if [ -s "$tmp_file" ]; then
|
|
||||||
suggested_name=$(grep -m 1 "^FILENAME:" "$tmp_file" | sed 's/^FILENAME: *//g' | tr -d '\r' | xargs)
|
|
||||||
|
|
||||||
if [ -n "$suggested_name" ]; then
|
|
||||||
# FILENAME行を除去して保存
|
|
||||||
sed '/^FILENAME:/d' "$tmp_file" > "$OUTPUT_DIR/$suggested_name"
|
|
||||||
rm "$tmp_file"
|
|
||||||
echo "Done: $OUTPUT_DIR/$suggested_name"
|
|
||||||
else
|
|
||||||
mv "$tmp_file" "$OUTPUT_DIR/$filename"
|
|
||||||
echo "Done: $filename (No rename)"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
rm -f "$tmp_file"
|
|
||||||
echo "Error processing $filename"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# パイプの途中でエラーが発生した場合も終了ステータスに反映させる
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
# スクリプトの場所 (scripts/) からプロジェクトルート (notebook/) を動的に取得
|
|
||||||
BASE_DIR=$(cd "$(dirname "$0")/.." && pwd)
|
|
||||||
REFACTOR_DIR="$BASE_DIR/refactoring"
|
|
||||||
SKILL_FILE="$BASE_DIR/.gemini/skills/strudel_refactor.md"
|
|
||||||
GEMINI_REF="$BASE_DIR/gemini.md"
|
|
||||||
STRUDEL_REF="$BASE_DIR/.gemini/reference.md"
|
|
||||||
|
|
||||||
# 出力先フォルダの作成
|
|
||||||
if [ ! -f "$SKILL_FILE" ]; then
|
|
||||||
echo "Error: Skill file not found at $SKILL_FILE"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p "$REFACTOR_DIR"
|
|
||||||
|
|
||||||
# ファイルが見つからない場合にワイルドカードをそのまま展開しない設定
|
|
||||||
shopt -s nullglob
|
|
||||||
|
|
||||||
# 引数がある場合はそれを使用し、ない場合は strudel/ フォルダの全mdファイルを対象にする
|
|
||||||
if [ $# -gt 0 ]; then
|
|
||||||
files=("$@")
|
|
||||||
else
|
|
||||||
files=("$BASE_DIR/strudel"/*.md)
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Strudel Code Analysis & Refactoring Skill started..."
|
|
||||||
|
|
||||||
for file in "${files[@]}"; do
|
|
||||||
# 除外設定
|
|
||||||
[ -f "$file" ] || continue
|
|
||||||
|
|
||||||
filename=$(basename "$file")
|
|
||||||
# 特定のファイルやディレクトリを除外
|
|
||||||
[[ "$filename" =~ ^(Strudel Making Sound|Strudel Study)\.md$ ]] && continue
|
|
||||||
[[ "$file" =~ /($REFACTOR_DIR|explained|script)/ ]] && continue
|
|
||||||
|
|
||||||
echo "Processing $filename..."
|
|
||||||
|
|
||||||
# 知識ベースとスキルファイルを組み合わせて実行
|
|
||||||
tmp_file="$REFACTOR_DIR/tmp_$filename"
|
|
||||||
|
|
||||||
( [ -f "$GEMINI_REF" ] && cat "$GEMINI_REF"; \
|
|
||||||
[ -f "$STRUDEL_REF" ] && cat "$STRUDEL_REF"; \
|
|
||||||
echo ""; cat "$SKILL_FILE"; \
|
|
||||||
echo ""; cat "$file" ) | gemini > "$tmp_file"
|
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
# 最初の数行から FILENAME: タグを検索(より柔軟な抽出)
|
|
||||||
suggested_name=$(grep -m 1 "^FILENAME:" "$tmp_file" | sed 's/^FILENAME: *//g' | tr -d '\r')
|
|
||||||
|
|
||||||
if [ -n "$suggested_name" ]; then
|
|
||||||
# FILENAME行を除去して保存 (最初の1行目にあると仮定しつつ、sedで安全に削除)
|
|
||||||
sed '/^FILENAME:/d' "$tmp_file" > "$REFACTOR_DIR/$suggested_name"
|
|
||||||
rm "$tmp_file"
|
|
||||||
echo "Successfully refactored and renamed to: $suggested_name"
|
|
||||||
else
|
|
||||||
mv "$tmp_file" "$REFACTOR_DIR/$filename"
|
|
||||||
echo "Successfully refactored: $filename (Rename tag not found)"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
rm -f "$tmp_file"
|
|
||||||
echo "Error processing $filename"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
Reference in New Issue
Block a user