@hidechae/eztab-mcp 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/server.js +42 -29
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -103,7 +103,7 @@ Run standalone for testing: `task mcp` (or `npx tsx mcp/server.ts`).
|
|
|
103
103
|
| `set_tuning` | Replace tuning / string count (`track` で対象パートを指定) |
|
|
104
104
|
| `add_track` / `remove_track` | パート(ベース・2本目のギターなど)の追加・削除。メインを含めて最大4、track 0(メイン)は削除不可 |
|
|
105
105
|
| `set_tone` | パートの再生音色を設定する(`track` で対象パートを指定)。`add_track` でも `tone` を指定できる |
|
|
106
|
-
| `set_backing_style` | 伴奏(コード)の音を設定する: `pad`(既定)/ `guitar` / `piano` / `bass`(ルートのみ) |
|
|
106
|
+
| `set_backing_style` | 伴奏(コード)の音を設定する: `pad`(既定)/ `guitar` / `acoustic` / `piano` / `bass`(ルートのみ)/ `upright`(ルートのみ)/ `synth` / `strings` |
|
|
107
107
|
|
|
108
108
|
### 複数パート(トラック)
|
|
109
109
|
|
|
@@ -145,6 +145,8 @@ Run standalone for testing: `task mcp` (or `npx tsx mcp/server.ts`).
|
|
|
145
145
|
0.7.0以降は伴奏(コード)の音(docs/design/0011-backing-styles.md)を `set_backing_style` で設定できます。
|
|
146
146
|
|
|
147
147
|
- `pad`(既定。従来の音)/ `guitar` / `piano` / `bass`(コードの構成音を鳴らさず、ルートだけをベースで弾く。分数コードは分母の音)
|
|
148
|
+
- 0.8.0以降は `acoustic`(アコースティックギター)/ `upright`(ウッドベース。`bass` と同じくルートだけ)/ `synth` / `strings` も選べます。
|
|
149
|
+
0.7.x 以前の版でこれらの値のタブを開くと、値は取り除かれてパッドに戻ります
|
|
148
150
|
- `get_tab` はパッド以外のとき、先頭行に `backing=guitar` のように表示する
|
|
149
151
|
- 形式リビジョンは変わらない。0.6.1以前のMCPでも、設定されたタブを編集・送信でき、値は保持される
|
|
150
152
|
|
package/dist/server.js
CHANGED
|
@@ -28,7 +28,16 @@ function normalizeTone(raw) {
|
|
|
28
28
|
return raw !== "clean" && TONES.includes(raw) ? raw : void 0;
|
|
29
29
|
}
|
|
30
30
|
var DEFAULT_MAIN_TRACK_NAME = "Guitar";
|
|
31
|
-
var BACKING_STYLES = [
|
|
31
|
+
var BACKING_STYLES = [
|
|
32
|
+
"pad",
|
|
33
|
+
"guitar",
|
|
34
|
+
"acoustic",
|
|
35
|
+
"piano",
|
|
36
|
+
"bass",
|
|
37
|
+
"upright",
|
|
38
|
+
"synth",
|
|
39
|
+
"strings"
|
|
40
|
+
];
|
|
32
41
|
function normalizeBackingStyle(raw) {
|
|
33
42
|
return raw !== "pad" && BACKING_STYLES.includes(raw) ? raw : void 0;
|
|
34
43
|
}
|
|
@@ -345,10 +354,10 @@ function normalizeDocument(data) {
|
|
|
345
354
|
data.version = TAB_FILE_VERSION;
|
|
346
355
|
return data;
|
|
347
356
|
}
|
|
348
|
-
function normalizeTrackMeta(raw, fallbackName) {
|
|
357
|
+
function normalizeTrackMeta(raw, fallbackName, missingIdPrefix = "") {
|
|
349
358
|
const volume = Number(raw?.volume);
|
|
350
359
|
const meta = {
|
|
351
|
-
id: typeof raw?.id === "string" && raw.id ? raw.id : newTabId(),
|
|
360
|
+
id: typeof raw?.id === "string" && raw.id ? raw.id : missingIdPrefix + newTabId(),
|
|
352
361
|
name: typeof raw?.name === "string" && raw.name.trim() ? raw.name : fallbackName,
|
|
353
362
|
volume: Number.isFinite(volume) ? Math.max(0, Math.min(1, volume)) : 1,
|
|
354
363
|
muted: raw?.muted === true
|
|
@@ -377,7 +386,7 @@ function normalizeTracks(data) {
|
|
|
377
386
|
const rawMeasures = Array.isArray(t?.measures) ? t.measures : [];
|
|
378
387
|
if (rawMeasures.length !== measures.length) data.trackMismatch = true;
|
|
379
388
|
return {
|
|
380
|
-
...normalizeTrackMeta(t, `Track ${i + 2}
|
|
389
|
+
...normalizeTrackMeta(t, `Track ${i + 2}`, "legacy:"),
|
|
381
390
|
tuning,
|
|
382
391
|
measures: measures.map((m, mi) => fitTrackMeasure(rawMeasures[mi], m, tuning.length))
|
|
383
392
|
};
|
|
@@ -586,6 +595,9 @@ function noteToMidi(note) {
|
|
|
586
595
|
// ../src/lib/playbackRate.ts
|
|
587
596
|
var PLAYBACK_RATES = Array.from({ length: 36 }, (_, i) => (5 + i) / 20);
|
|
588
597
|
|
|
598
|
+
// ../src/lib/strum.ts
|
|
599
|
+
var MAX_SHARE = 1 / 6;
|
|
600
|
+
|
|
589
601
|
// ../src/lib/tracks.ts
|
|
590
602
|
function newUid() {
|
|
591
603
|
return newTabId();
|
|
@@ -850,6 +862,7 @@ var GUITAR_CLEAN = {
|
|
|
850
862
|
cabHz: OPEN,
|
|
851
863
|
cabQ: 0,
|
|
852
864
|
lowCutHz: 70,
|
|
865
|
+
lowCutQ: 0,
|
|
853
866
|
level: 1
|
|
854
867
|
};
|
|
855
868
|
var BASS_CLEAN = { ...GUITAR_CLEAN, pickupHz: 2600, pickupQ: 1, lowCutHz: 30 };
|
|
@@ -872,26 +885,33 @@ var CHAINS = {
|
|
|
872
885
|
lowCutHz: 80,
|
|
873
886
|
level: 0.26
|
|
874
887
|
},
|
|
888
|
+
// A deep, soft high gain (a Friedman or a Hughes & Kettner rather than a
|
|
889
|
+
// bright Marshall): the lows mostly stay in, both stages are driven hard,
|
|
890
|
+
// and the top is rolled off early instead of pushed at the presence range.
|
|
875
891
|
distortion: {
|
|
876
892
|
...GUITAR_CLEAN,
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
893
|
+
pickupHz: 3800,
|
|
894
|
+
pickupQ: 1,
|
|
895
|
+
tightHz: 140,
|
|
896
|
+
pushDb: 5,
|
|
880
897
|
drive: 0.5,
|
|
881
|
-
stage1: { gain:
|
|
898
|
+
stage1: { gain: 30, bias: 0.2 },
|
|
882
899
|
// The next tube stage is inverted, so it clips the other half harder.
|
|
883
900
|
drive2: 1,
|
|
884
|
-
stage2: { gain:
|
|
885
|
-
interHpHz:
|
|
886
|
-
interLpHz:
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
901
|
+
stage2: { gain: 8, bias: -0.3 },
|
|
902
|
+
interHpHz: 110,
|
|
903
|
+
interLpHz: 4200,
|
|
904
|
+
// Low mids for body, where the bright voicing had a presence peak.
|
|
905
|
+
bodyHz: 400,
|
|
906
|
+
bodyDb: 2,
|
|
907
|
+
cabHz: 3800,
|
|
908
|
+
cabQ: 1,
|
|
909
|
+
lowCutHz: 85,
|
|
910
|
+
lowCutQ: 2,
|
|
911
|
+
level: 0.15
|
|
893
912
|
},
|
|
894
|
-
|
|
913
|
+
// The body is in the waveform itself (stringSynth's acousticParams).
|
|
914
|
+
acoustic: { ...GUITAR_CLEAN, pickupHz: 12e3, pickupQ: 0, level: 1.2 },
|
|
895
915
|
piano: PIANO,
|
|
896
916
|
synth: { ...DIRECT, level: 0.8 },
|
|
897
917
|
strings: { ...DIRECT, level: 0.8 }
|
|
@@ -925,15 +945,8 @@ var CHAINS = {
|
|
|
925
945
|
lowCutHz: 35,
|
|
926
946
|
level: 0.15
|
|
927
947
|
},
|
|
928
|
-
// Upright bass.
|
|
929
|
-
acoustic: {
|
|
930
|
-
...BASS_CLEAN,
|
|
931
|
-
pickupHz: 3e3,
|
|
932
|
-
pickupQ: 0,
|
|
933
|
-
bodyHz: 100,
|
|
934
|
-
bodyDb: 6,
|
|
935
|
-
level: 1.4
|
|
936
|
-
},
|
|
948
|
+
// Upright bass. The body is in the waveform itself (stringSynth's uprightParams).
|
|
949
|
+
acoustic: { ...BASS_CLEAN, pickupHz: 5e3, pickupQ: 0, level: 1.4 },
|
|
937
950
|
piano: PIANO,
|
|
938
951
|
// Synth bass.
|
|
939
952
|
synth: { ...DIRECT, level: 0.8 },
|
|
@@ -1280,7 +1293,7 @@ var state = {
|
|
|
1280
1293
|
source: null
|
|
1281
1294
|
};
|
|
1282
1295
|
var server = new McpServer(
|
|
1283
|
-
{ name: "eztab", version: "0.
|
|
1296
|
+
{ name: "eztab", version: "0.8.0" },
|
|
1284
1297
|
{
|
|
1285
1298
|
instructions: "All indices are 0-based: measure 0 is the first measure, string 0 is the top (highest) string, and column 0 is the first column. Notes and chords share the same column grid. Subdivisions are per beat and can differ within a measure (e.g. [2,2,3,2] mixes a triplet beat into straight eighths), so columns per measure = the sum of its per-beat subdivisions; get_tab's ruler shows the column indices. add_measures `at` is a 0-based insert position too. No need to ask the user about indexing. Exception: write_measures uses guitar string numbers (1 = top line), matching the labels get_tab prints. To write whole measures (e.g. transcribing a score or an image), prefer write_measures over set_cells \u2014 it takes one string per beat and does the column arithmetic for you. For transcribing from an image, follow the import_tab_from_image prompt. To deliver a result to the EZTab app, call send_to_eztab; to fix an existing tab, list_tabs \u2192 open_tab \u2192 edit \u2192 send_to_eztab. A tab can hold up to 4 tracks (parts, e.g. guitar + bass); track 0 is the main track. Tools that edit notes take an optional 0-based `track` (default 0). Measures and time signatures are shared by all tracks (adding/removing a measure affects every track); subdivisions are per track; chords belong to track 0 and use its columns."
|
|
1286
1299
|
}
|
|
@@ -1803,7 +1816,7 @@ server.tool(
|
|
|
1803
1816
|
);
|
|
1804
1817
|
server.tool(
|
|
1805
1818
|
"set_backing_style",
|
|
1806
|
-
"Set how the chord backing (the chords written with set_chords / @Name) sounds in playback: pad (the default soft pad), guitar, piano, or
|
|
1819
|
+
"Set how the chord backing (the chords written with set_chords / @Name) sounds in playback: pad (the default soft pad), guitar (clean electric), acoustic (acoustic guitar), piano, synth, strings, or only the root \u2014 or a slash chord's bass note \u2014 on a bass (electric) or upright (upright bass).",
|
|
1807
1820
|
{ style: z.enum(BACKING_STYLES) },
|
|
1808
1821
|
async (a) => {
|
|
1809
1822
|
const doc = edit(0, () => {
|