@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 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 = ["pad", "guitar", "piano", "bass"];
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
- pickupQ: 2,
878
- tightHz: 250,
879
- pushDb: 6,
893
+ pickupHz: 3800,
894
+ pickupQ: 1,
895
+ tightHz: 140,
896
+ pushDb: 5,
880
897
  drive: 0.5,
881
- stage1: { gain: 24, bias: 0.25 },
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: 5, bias: -0.35 },
885
- interHpHz: 160,
886
- interLpHz: 6500,
887
- bodyHz: 2800,
888
- bodyDb: 4,
889
- cabHz: 4800,
890
- cabQ: 3,
891
- lowCutHz: 90,
892
- level: 0.17
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
- acoustic: { ...GUITAR_CLEAN, pickupHz: 9e3, pickupQ: 0, bodyDb: 5, level: 1.2 },
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.7.1" },
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 bass (only the root \u2014 or a slash chord's bass note \u2014 on a bass).",
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, () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hidechae/eztab-mcp",
3
- "version": "0.7.1",
3
+ "version": "0.8.0",
4
4
  "description": "MCP server for EZTab — lets an AI agent build and edit guitar/bass tablature.",
5
5
  "type": "module",
6
6
  "bin": {