From 275296eda7558f319819a959b6d0b1b3da18fada Mon Sep 17 00:00:00 2001 From: xin <98406118+9c5s@users.noreply.github.com> Date: Sun, 12 Apr 2026 02:03:09 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20pitchBend=E3=82=92=E7=AC=A6=E5=8F=B7?= =?UTF-8?q?=E4=BB=98=E3=81=8D16bit=E3=81=A7=E8=AA=AD=E3=81=BF=E5=8F=96?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit readUInt16LEをreadInt16LEに変更し、負のピッチ値が 65536加算された不正な値として返される問題を修正する --- .changeset/fix-pitch-bend-signed.md | 7 +++++++ src/network.ts | 2 +- tests/packet-parsers.test.ts | 14 ++++++++------ 3 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 .changeset/fix-pitch-bend-signed.md diff --git a/.changeset/fix-pitch-bend-signed.md b/.changeset/fix-pitch-bend-signed.md new file mode 100644 index 0000000..64b767b --- /dev/null +++ b/.changeset/fix-pitch-bend-signed.md @@ -0,0 +1,7 @@ +--- +"@9c5s/node-tcnet": patch +--- + +pitchBendを符号付き16bitで読み取るよう修正 + +`readUInt16LE`を`readInt16LE`に変更し、負のピッチ値が正しく負の数値として返されるようにした。 diff --git a/src/network.ts b/src/network.ts index 26b4dc2..9ad0639 100644 --- a/src/network.ts +++ b/src/network.ts @@ -574,7 +574,7 @@ export class TCNetDataPacketMetrics extends TCNetDataPacket { speed: this.buffer.readUInt32LE(40), beatNumber: this.buffer.readUInt32LE(57), bpm: this.buffer.readUInt32LE(112), - pitchBend: this.buffer.readUInt16LE(116), + pitchBend: this.buffer.readInt16LE(116), trackID: this.buffer.readUInt32LE(118), }; } diff --git a/tests/packet-parsers.test.ts b/tests/packet-parsers.test.ts index 0930cff..6618833 100644 --- a/tests/packet-parsers.test.ts +++ b/tests/packet-parsers.test.ts @@ -544,7 +544,7 @@ describe("TCNetDataPacketMetrics", () => { buffer.writeUInt32LE(100000, 40); // speed buffer.writeUInt32LE(4, 57); // beatNumber buffer.writeUInt32LE(14000, 112); // bpm (= 140.00 BPM * 100) - buffer.writeUInt16LE(40000, 116); // pitchBend (32768=100%) + buffer.writeInt16LE(600, 116); // pitchBend (+6.00%) buffer.writeUInt32LE(777, 118); // trackID const packet = new TCNetDataPacketMetrics(); @@ -564,7 +564,7 @@ describe("TCNetDataPacketMetrics", () => { expect(packet.data!.speed).toBe(100000); expect(packet.data!.beatNumber).toBe(4); expect(packet.data!.bpm).toBe(14000); - expect(packet.data!.pitchBend).toBe(40000); + expect(packet.data!.pitchBend).toBe(600); expect(packet.data!.trackID).toBe(777); }); @@ -580,9 +580,11 @@ describe("TCNetDataPacketMetrics", () => { }); it.each([ - { value: 0, label: "最小値" }, - { value: 32768, label: "100%基準" }, - { value: 65535, label: "最大値" }, + { value: 0, label: "ピッチ変更なし" }, + { value: 600, label: "+6.00%" }, + { value: -600, label: "-6.00%" }, + { value: 32767, label: "最大値" }, + { value: -32768, label: "最小値" }, ])("pitchBend=$value ($label) を正しくパースする", ({ value }) => { const buffer = Buffer.alloc(122); buffer.writeUInt8(3, 2); @@ -590,7 +592,7 @@ describe("TCNetDataPacketMetrics", () => { buffer.writeUInt8(200, 7); buffer.writeUInt8(2, 24); buffer.writeUInt8(1, 25); - buffer.writeUInt16LE(value, 116); + buffer.writeInt16LE(value, 116); const packet = new TCNetDataPacketMetrics(); packet.buffer = buffer; packet.header = createHeader(buffer);