From 85288cba97126d4892f6c2b0839107c9134558ff Mon Sep 17 00:00:00 2001 From: Alex TTS Date: Thu, 4 Aug 2022 03:06:49 +0200 Subject: [PATCH 1/9] layout fix --- tsconfig.json | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index af43527..60e6b43 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,12 +5,13 @@ "importHelpers": true, "sourceMap": true, "declaration": true, - + "strict": true, // Module resolution "moduleResolution": "node", - // Type checking - "lib": ["es2017"], + "lib": [ + "es2017", + ], "alwaysStrict": true, "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": true, @@ -19,11 +20,14 @@ "noImplicitThis": true, "strictNullChecks": true, "skipLibCheck": true, - "module": "CommonJS", - "types": ["node"], + "types": [ + "node" + ], "outDir": "./dist" }, "compileOnSave": true, - "include": ["src/**/*"] -} + "include": [ + "src/**/*", + ] +} \ No newline at end of file From db8c583203a33646d86fde99aec9b4237d86a978 Mon Sep 17 00:00:00 2001 From: Alex TTS Date: Thu, 4 Aug 2022 04:51:58 +0200 Subject: [PATCH 2/9] not much --- src/index.ts | 1 + src/network.ts | 3 ++- tsconfig.json | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 8c562cb..4e844bc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,3 +3,4 @@ export { TCNetClient, TCNetConfiguration } from "./tcnet"; export { PioneerDJTCClient, LayerIndex, LayerIndexUtil, TrackInfo } from "./pioneer"; export * from "./network"; + diff --git a/src/network.ts b/src/network.ts index ce89800..55a95ef 100644 --- a/src/network.ts +++ b/src/network.ts @@ -272,8 +272,9 @@ export class TCNetTimePacket extends TCNetPacket { layerTotalTime: number[] = new Array(8); layerBeatmarker: number[] = new Array(8); layerState: TCNetLayerStatus[] = new Array(8); - generalSMPTEMode: number; + generalSMPTEMode: number; layerTimecode: TCNetTimecode[] = new Array(8); + read(): void { for (let n = 0; n < 8; n++) { diff --git a/tsconfig.json b/tsconfig.json index 60e6b43..7e03149 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,7 @@ "importHelpers": true, "sourceMap": true, "declaration": true, - "strict": true, + // "strict": true, // Module resolution "moduleResolution": "node", // Type checking From d06cf4e17da54548fca1aa515873ad7865c08682 Mon Sep 17 00:00:00 2001 From: Alex TTS Date: Thu, 4 Aug 2022 06:40:10 +0200 Subject: [PATCH 3/9] fixed regex --- src/network.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/network.ts b/src/network.ts index 55a95ef..bfcd1e3 100644 --- a/src/network.ts +++ b/src/network.ts @@ -1,4 +1,5 @@ import { assert } from "console"; +import { generateKey } from "crypto"; export enum TCNetMessageType { OptIn = 2, @@ -366,8 +367,8 @@ export class TCNetDataPacketMetadata extends TCNetDataPacket { trackID: number; read(): void { - this.trackArtist = this.buffer.slice(29, 285).toString("ascii").replace(/\0.*$/g, ""); - this.trackTitle = this.buffer.slice(285, 541).toString("ascii").replace(/\0.*$/g, ""); + this.trackArtist = this.buffer.slice(29, 285).toString("ascii").replace(/\x00/g, "").trimEnd(); + this.trackTitle = this.buffer.slice(285, 541).toString("ascii").replace(/\x00/g, "").trimEnd(); this.trackKey = this.buffer.readUInt16LE(541); this.trackID = this.buffer.readUInt32LE(543); } From c973e0ad26f89a43c3d864de5b02ac838b8729ba Mon Sep 17 00:00:00 2001 From: Alex TTS Date: Thu, 4 Aug 2022 07:08:37 +0200 Subject: [PATCH 4/9] div by 100 to show correct bpm value --- src/network.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network.ts b/src/network.ts index bfcd1e3..bdbc1e1 100644 --- a/src/network.ts +++ b/src/network.ts @@ -347,7 +347,7 @@ export class TCNetDataPacketMetrics extends TCNetDataPacket { this.currentPosition = this.buffer.readUInt32LE(36); this.speed = this.buffer.readUInt32LE(40); this.beatNumber = this.buffer.readUInt32LE(57); - this.bpm = this.buffer.readUInt32LE(112); + this.bpm = this.buffer.readUInt32LE(112)/100; this.pitchBend = this.buffer.readUInt16LE(116); this.trackID = this.buffer.readUInt32LE(118); } From a5ddc3d07f6c4b58ee5598607c18447262035aac Mon Sep 17 00:00:00 2001 From: Alex TTS Date: Thu, 4 Aug 2022 19:59:21 +0200 Subject: [PATCH 5/9] Looking into more small fixes and show more data --- src/pioneer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pioneer.ts b/src/pioneer.ts index 25ca906..0641d94 100644 --- a/src/pioneer.ts +++ b/src/pioneer.ts @@ -1,4 +1,4 @@ -import { TCNetClient, TCNetPacket } from "."; +import { TCNetClient, TCNetPacket } from "./"; import { TCNetConfiguration } from "./tcnet"; import { TCNetStatusPacket, From 1521bf824eac354c752f5422993402fff2e0b6df Mon Sep 17 00:00:00 2001 From: Alex TTS Date: Thu, 4 Aug 2022 19:59:45 +0200 Subject: [PATCH 6/9] set "strictPropertyInitialization": false --- tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tsconfig.json b/tsconfig.json index 7e03149..ac36da5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,7 @@ "importHelpers": true, "sourceMap": true, "declaration": true, + "strictPropertyInitialization": false, // "strict": true, // Module resolution "moduleResolution": "node", From 554c1fbca8eefd6c5148025eb638ee58a5fcd3a9 Mon Sep 17 00:00:00 2001 From: Alex TTS Date: Thu, 4 Aug 2022 20:00:38 +0200 Subject: [PATCH 7/9] enabled strict mode --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index ac36da5..6a3163c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "sourceMap": true, "declaration": true, "strictPropertyInitialization": false, - // "strict": true, + "strict": true, // Module resolution "moduleResolution": "node", // Type checking From c71f4b03734e9146069fa4de09d93ec958e6457b Mon Sep 17 00:00:00 2001 From: LTTS Date: Sun, 7 Aug 2022 04:05:10 +0200 Subject: [PATCH 8/9] idc --- src/network.ts | 39 +++++++++++++++++++++++++++++++++++++-- src/pioneer.ts | 35 +++++++++++++++++++++++++++++++++-- src/tcnet.ts | 38 +++++++++++++++++++++++++++----------- 3 files changed, 97 insertions(+), 15 deletions(-) diff --git a/src/network.ts b/src/network.ts index bdbc1e1..8b1d65c 100644 --- a/src/network.ts +++ b/src/network.ts @@ -366,7 +366,7 @@ export class TCNetDataPacketMetadata extends TCNetDataPacket { trackKey: number; trackID: number; - read(): void { + read(): void { this.trackArtist = this.buffer.slice(29, 285).toString("ascii").replace(/\x00/g, "").trimEnd(); this.trackTitle = this.buffer.slice(285, 541).toString("ascii").replace(/\x00/g, "").trimEnd(); this.trackKey = this.buffer.readUInt16LE(541); @@ -378,8 +378,43 @@ export class TCNetDataPacketMetadata extends TCNetDataPacket { length(): number { return 548; } +} + +export class TCNetDataPacketBeatGridData extends TCNetDataPacket{ + dataSize : number; + totalPacket : number; + packetNo: number; + dataClusterSize: number; + beatNumber: number; + beatType: number; + beatTypeTimestamp: number; + packetNumber: number; + //offset: number; + + read(): void { + + //this.packetNumber = this.buffer.readUInt16LE(34); + //console.log(this.packetNumber); + //console.log(this.buffer); + //this.offset = ((this.beatNumber * 8) - (this.packetNumber * 2400)); // ((this.beatNumber * 8) - (this.packetNumber * 2400)); + + this.dataSize = this.buffer.readUInt16LE(26); + this.totalPacket = this.buffer.readUInt16LE(26); + + this.beatNumber = this.buffer.readUInt16LE(42); + this.beatType = this.buffer.readUInt16LE(44); // (20=Down Beat, 10=Upbeat) + this.beatTypeTimestamp = this.buffer.readUInt16LE(46); + + } + write(): void { + throw new Error("not supported!"); + } + length(): number { + return 2442; + } } + export interface Constructable { new (...args: any[]): any; } @@ -403,7 +438,7 @@ export const TCNetPackets: Record = { export const TCNetDataPackets: Record = { [TCNetDataPacketType.MetricsData]: TCNetDataPacketMetrics, [TCNetDataPacketType.MetaData]: TCNetDataPacketMetadata, - [TCNetDataPacketType.BeatGridData]: null, // not yet implemented + [TCNetDataPacketType.BeatGridData]: TCNetDataPacketBeatGridData, // not yet implemented [TCNetDataPacketType.CUEData]: null, // not yet implemented [TCNetDataPacketType.SmallWaveFormData]: null, // not yet implemented [TCNetDataPacketType.BigWaveFormData]: null, // not yet implemented diff --git a/src/pioneer.ts b/src/pioneer.ts index 0641d94..d19a57f 100644 --- a/src/pioneer.ts +++ b/src/pioneer.ts @@ -4,6 +4,7 @@ import { TCNetStatusPacket, TCNetDataPacketType, TCNetDataPacketMetadata, + TCNetDataPacketBeatGridData, TCNetLayerStatus, TCNetDataPacketMetrics, TCNetLayerSyncMaster, @@ -11,6 +12,7 @@ import { import EventEmitter = require("events"); import { assert } from "console"; + /** * High level implementation of TCNet for PioneerDJ equipment * @@ -44,8 +46,9 @@ export class PioneerDJTCClient extends EventEmitter { * Disconnects from TCNet network */ disconnect(): void { - this.tcnet.disconnect(); this.removeAllListeners(); + this.tcnet.disconnect(); + } /** @@ -93,7 +96,9 @@ export class PioneerDJTCClient extends EventEmitter { * @returns track info of the layer */ async trackInfo(layer: LayerIndex): Promise { - const response = await this.client().requestData(TCNetDataPacketType.MetaData, layer); + const response = ( + await this.client().requestData(TCNetDataPacketType.MetaData, layer) + ); return { ...response, }; @@ -112,6 +117,21 @@ export class PioneerDJTCClient extends EventEmitter { ...response, }; } + + /** + * Request beatgrid of a specific layer + * @param layer layer to query + * @returns metrics of the layer + */ + async beatGridData(layer: LayerIndex): Promise { + const response = ( + await this.client().requestData(TCNetDataPacketType.BeatGridData, layer) + ); + return { + ...response, + }; + } + } /** @@ -228,3 +248,14 @@ export type LayerMetrics = { pitchBend: number; trackID: number; }; + +export type beatGridData = { + dataSize : number; + totalPacket : number; + packetNo: number; + dataClusterSize: number; + beatNumber: number; + beatType: number; + beatTypeTimestamp: number; + packetNumber: number; +}; diff --git a/src/tcnet.ts b/src/tcnet.ts index 45391d4..aba53a5 100644 --- a/src/tcnet.ts +++ b/src/tcnet.ts @@ -1,15 +1,16 @@ import { Socket, createSocket, RemoteInfo } from "dgram"; import EventEmitter = require("events"); +import { buffer } from "stream/consumers"; import * as nw from "./network"; import { interfaceAddress } from "./utils"; const TCNET_BROADCAST_PORT = 60000; const TCNET_TIMESTAMP_PORT = 60001; -type STORED_RESOLVE = (value?: nw.TCNetDataPacket | PromiseLike | undefined) => void; +type STORED_RESOLVE = (value?: nw.TCNetDataPacket | PromiseLike | any) => void; //any was undefined export class TCNetConfiguration { - unicastPort = 65032; + unicastPort = 65032; // 65032 applicationCode = 0xffff; nodeId = Math.floor(Math.random() * 0xffff); nodeName = "TCNET.JS"; @@ -18,7 +19,7 @@ export class TCNetConfiguration { broadcastInterface: string | null = null; broadcastAddress = "255.255.255.255"; requestTimeout = 2000; - debug = false; + debug = true; } /** @@ -92,14 +93,29 @@ export class TCNetClient extends EventEmitter { /** * Disconnects from TCNet network */ - public disconnect(): void { - clearInterval(this.announcementInterval); + public disconnect(): void { + clearInterval(this.announcementInterval); + this.optOut(); this.broadcastSocket.close(); this.unicastSocket.close(); - this.removeAllListeners(); - this.connected = false; + this.timestampSocket.close(); + this.removeAllListeners(); + //this.connected = false; } + + private async optOut(): Promise { + const optOutPacket = new nw.TCNetOptOutPacket(); + + await this.broadcastPacket(optOutPacket); + if (this.server) { + await this.sendServer(optOutPacket); + } + } + + + + /** * Waiting for unicast from a master */ @@ -170,7 +186,7 @@ export class TCNetClient extends EventEmitter { this.emit("broadcast", packet); } } else { - if (this.config.debug) console.log("Unknown broadcast packet type: " + mgmtHeader.messageType); + if (this.config.debug) console.log("Unknown broadcast packet type: " + mgmtHeader.messageType ); } } @@ -214,7 +230,7 @@ export class TCNetClient extends EventEmitter { } } } else { - if (this.config.debug) console.log("Unknown packet type: " + mgmtHeader.messageType); + if (this.config.debug) console.log("Unknown packet type: " + mgmtHeader.messageType + mgmtHeader.nodeOptions + mgmtHeader.buffer.toString()); } } @@ -248,8 +264,8 @@ export class TCNetClient extends EventEmitter { packet.header.messageType = packet.type(); packet.header.nodeName = this.config.nodeName; packet.header.seq = this.seq = (this.seq + 1) % 255; - packet.header.nodeType = 0x04; - packet.header.nodeOptions = 0; + packet.header.nodeType = 0x04; //0x04 + packet.header.nodeOptions = 1; packet.header.timestamp = 0; } From b9e67d587757d50cfc1651b7df0039adf8e6409c Mon Sep 17 00:00:00 2001 From: LTTS Date: Mon, 8 Aug 2022 17:55:17 +0200 Subject: [PATCH 9/9] started work on mixerdata packets --- src/network.ts | 195 +++++++++++++++++++++++++++++++++++++++++++------ src/pioneer.ts | 89 +++++++++++++++++++--- src/tcnet.ts | 13 ++-- 3 files changed, 258 insertions(+), 39 deletions(-) diff --git a/src/network.ts b/src/network.ts index 8b1d65c..27eb76c 100644 --- a/src/network.ts +++ b/src/network.ts @@ -244,6 +244,29 @@ export class TCNetRequestPacket extends TCNetPacket { } } +export class TCNetApplicationData extends TCNetPacket { + dataType: number; + layer: number; + + read(): void { + this.dataType = this.buffer.readUInt8(24); + this.layer = this.buffer.readUInt8(25); + } + write(): void { + assert(0 <= this.dataType && this.dataType <= 255); + assert(0 <= this.layer && this.layer <= 255); + + this.buffer.writeUInt8(this.dataType, 24); + this.buffer.writeUInt8(this.layer, 25); + } + length(): number { + return 62; + } + type(): number { + return TCNetMessageType.ApplicationData; + } +} + export enum TCNetTimecodeState { Stopped = 0, Running = 1, @@ -273,9 +296,9 @@ export class TCNetTimePacket extends TCNetPacket { layerTotalTime: number[] = new Array(8); layerBeatmarker: number[] = new Array(8); layerState: TCNetLayerStatus[] = new Array(8); - generalSMPTEMode: number; + generalSMPTEMode: number; layerTimecode: TCNetTimecode[] = new Array(8); - + read(): void { for (let n = 0; n < 8; n++) { @@ -340,15 +363,15 @@ export class TCNetDataPacketMetrics extends TCNetDataPacket { trackID: number; read(): void { - this.state = this.buffer.readUInt8(27); + this.state = this.buffer.readUInt8(27); // 1 byte 0-FF* this.syncMaster = this.buffer.readUInt8(29); this.beatMarker = this.buffer.readUInt8(31); - this.trackLength = this.buffer.readUInt32LE(32); + this.trackLength = this.buffer.readUInt32LE(32); // 0-0x5265C00 (LITTLE ENDIAN) this.currentPosition = this.buffer.readUInt32LE(36); this.speed = this.buffer.readUInt32LE(40); this.beatNumber = this.buffer.readUInt32LE(57); - this.bpm = this.buffer.readUInt32LE(112)/100; - this.pitchBend = this.buffer.readUInt16LE(116); + this.bpm = this.buffer.readUInt32LE(112) / 100; + this.pitchBend = this.buffer.readUInt16LE(116); // 2 byte (16-BIT) 0-FFFF* (LITTLE ENDIAN) this.trackID = this.buffer.readUInt32LE(118); } @@ -363,13 +386,13 @@ export class TCNetDataPacketMetrics extends TCNetDataPacket { export class TCNetDataPacketMetadata extends TCNetDataPacket { trackArtist: string; trackTitle: string; - trackKey: number; + trackKey: string; trackID: number; - read(): void { + read(): void { this.trackArtist = this.buffer.slice(29, 285).toString("ascii").replace(/\x00/g, "").trimEnd(); this.trackTitle = this.buffer.slice(285, 541).toString("ascii").replace(/\x00/g, "").trimEnd(); - this.trackKey = this.buffer.readUInt16LE(541); + this.trackKey = this.buffer.slice(541, 566).toString("ascii").replace(/\x00/g, ""); this.trackID = this.buffer.readUInt32LE(543); } write(): void { @@ -378,45 +401,169 @@ export class TCNetDataPacketMetadata extends TCNetDataPacket { length(): number { return 548; } -} +} -export class TCNetDataPacketBeatGridData extends TCNetDataPacket{ - dataSize : number; - totalPacket : number; +export class TCNetDataPacketBeatGridData extends TCNetDataPacket { + dataSize: number; + totalPacket: number; packetNo: number; dataClusterSize: number; beatNumber: number; beatType: number; - beatTypeTimestamp: number; + beatTypeTimestamp: number; packetNumber: number; //offset: number; read(): void { - + //this.packetNumber = this.buffer.readUInt16LE(34); //console.log(this.packetNumber); //console.log(this.buffer); //this.offset = ((this.beatNumber * 8) - (this.packetNumber * 2400)); // ((this.beatNumber * 8) - (this.packetNumber * 2400)); - - this.dataSize = this.buffer.readUInt16LE(26); - this.totalPacket = this.buffer.readUInt16LE(26); - + + this.dataSize = this.buffer.readUInt32LE(26); + this.totalPacket = this.buffer.readUInt32LE(30); + this.beatNumber = this.buffer.readUInt16LE(42); - this.beatType = this.buffer.readUInt16LE(44); // (20=Down Beat, 10=Upbeat) - this.beatTypeTimestamp = this.buffer.readUInt16LE(46); + this.beatType = this.buffer.readUInt8(44); // (20=Down Beat, 10=Upbeat) + this.beatTypeTimestamp = this.buffer.readUInt16LE(46); + + console.log(this.dataSize + "datasize -- "); + console.log(this.totalPacket + "totalPacket --"); + console.log(this.beatNumber + "beatNumber --"); } write(): void { throw new Error("not supported!"); } + length(): number { return 2442; } } +export class TCNetDataPacketMixerData extends TCNetDataPacket { + + mixerId: number; + mixerType: number; + mixerName: string; + micEQHi: number; + micEQLow: number; + masterAudioLevel: number; + masterFaderLevel: number; + linkCueA: number; + linkCueB: number; + masterFilter: number; + masterCueA: number; + masterCueB: number; + masterIsolatorOnOff: number; + masterIsolatorHi: number; + masterIsolatorMid: number; + masterIsolatorLow: number; + filterHPF: number; + filterLPF: number; + filterRes: number; + sendFXEffect: number; + sendFXExt1: number; + sendFXExt2: number; + sendFXMasterMix: number; + sendFXSizeFeedback: number; + sendFXTime: number; + sendFXHPF: number; + sendFXLevel: number; + sendReturn3SourceSelect: number; + sendReturn3Type: number; + sendReturn3OnOff: number; + sendReturn3Level: number; + channelFaderCurve: number; + crossFaderCurve: number; + crossFader: number; + beatFxOnOff: number; + beatFxLevelDepth: number; + beatFxChannelSelect: number; + beatFxSelect: number; + beatFxFreqHi: number; + beatFxFreqMid: number; + beatFxFreqLow: number; + headphonesPreEq: number; + headphonesALevel: number; + headphonesAMix: number; + headphonesBLevel: number; + headphonesBMix: number; + boothLevel: number; + boothEqHi: number; + boothEqLow: number; + + read(): void { + + this.mixerId = this.buffer.readUInt8(25); + this.mixerType = this.buffer.readUInt8(26); + this.mixerName = this.buffer.slice(27, 59).toString("ascii").replace(/\x00/g, "").trimEnd(); + + this.micEQHi = this.buffer.readUInt8(59); + this.micEQLow = this.buffer.readUInt8(60); + this.masterAudioLevel = this.buffer.readUInt8(61); + this.masterFaderLevel = this.buffer.readUInt8(62); + this.linkCueA = this.buffer.readUInt8(67); + this.linkCueB = this.buffer.readUInt8(68); + + this.masterFilter = this.buffer.readUInt8(69); // nice + this.masterCueA = this.buffer.readUInt8(71); + this.masterCueB = this.buffer.readUInt8(72); + this.masterIsolatorOnOff = this.buffer.readUInt8(74); + this.masterIsolatorHi = this.buffer.readUInt8(75); + this.masterIsolatorMid = this.buffer.readUInt8(76); + this.masterIsolatorLow = this.buffer.readUInt8(77); + + this.filterHPF = this.buffer.readUInt8(79); + this.filterLPF = this.buffer.readUInt8(80); + this.filterRes = this.buffer.readUInt8(81); + + this.sendFXEffect = this.buffer.readUInt8(84); + this.sendFXExt1 = this.buffer.readUInt8(85); + this.sendFXExt2 = this.buffer.readUInt8(86); + this.sendFXMasterMix = this.buffer.readUInt8(87); + this.sendFXSizeFeedback = this.buffer.readUInt8(88); + this.sendFXTime = this.buffer.readUInt8(89); + this.sendFXHPF = this.buffer.readUInt8(90); + this.sendFXLevel = this.buffer.readUInt8(91); + this.sendReturn3SourceSelect = this.buffer.readUInt8(92); + this.sendReturn3Type = this.buffer.readUInt8(93); + this.sendReturn3OnOff = this.buffer.readUInt8(94); + this.sendReturn3Level = this.buffer.readUInt8(95); + this.channelFaderCurve = this.buffer.readUInt8(97); + this.crossFaderCurve = this.buffer.readUInt8(98); + this.crossFader = this.buffer.readUInt8(99); + this.beatFxOnOff = this.buffer.readUInt8(100); + this.beatFxLevelDepth = this.buffer.readUInt8(101); + + this.beatFxChannelSelect = this.buffer.readUInt8(102); + this.beatFxSelect = this.buffer.readUInt8(103); + this.beatFxFreqHi = this.buffer.readUInt8(14); + this.beatFxFreqMid = this.buffer.readUInt8(105); + this.beatFxFreqLow = this.buffer.readUInt8(106); + this.headphonesPreEq = this.buffer.readUInt8(107); + this.headphonesALevel = this.buffer.readUInt8(108); + this.headphonesAMix = this.buffer.readUInt8(109); + this.headphonesBLevel = this.buffer.readUInt8(110); + this.headphonesBMix = this.buffer.readUInt8(111); + this.boothLevel = this.buffer.readUInt8(112); + this.boothEqHi = this.buffer.readUInt8(113); + this.boothEqLow = this.buffer.readUInt8(114); + + } + write(): void { + throw new Error("not supported!"); + } + length(): number { + return 270; + } +} + + export interface Constructable { - new (...args: any[]): any; + new(...args: any[]): any; } export const TCNetPackets: Record = { @@ -426,7 +573,7 @@ export const TCNetPackets: Record = { [TCNetMessageType.TimeSync]: null, // not yet implemented [TCNetMessageType.Error]: null, // not yet implemented [TCNetMessageType.Request]: TCNetRequestPacket, - [TCNetMessageType.ApplicationData]: null, // not yet implemented + [TCNetMessageType.ApplicationData]: TCNetApplicationData, // not yet implemented [TCNetMessageType.Control]: null, // not yet implemented [TCNetMessageType.Text]: null, // not yet implemented [TCNetMessageType.Keyboard]: null, // not yet implemented @@ -442,5 +589,5 @@ export const TCNetDataPackets: Record { + async mixerData(): Promise { + const response = ( + await this.client().requestData(TCNetDataPacketType.MixerData, 2) + ); + return { + ...response, + }; + } + + + /** + * Request beatgrid of a specific layer + * @param layer layer to query + * @returns metrics of the layer + */ + async beatGridData(layer: LayerIndex): Promise { const response = ( await this.client().requestData(TCNetDataPacketType.BeatGridData, layer) ); @@ -233,7 +250,7 @@ export type TrackInfo = { trackID: number; trackArtist: string; trackTitle: string; - trackKey: number; + trackKey: string; }; export type LayerMetrics = { @@ -249,13 +266,67 @@ export type LayerMetrics = { trackID: number; }; -export type beatGridData = { - dataSize : number; - totalPacket : number; +export type BeatGridData = { + dataSize: number; + totalPacket: number; packetNo: number; dataClusterSize: number; beatNumber: number; beatType: number; - beatTypeTimestamp: number; + beatTypeTimestamp: number; packetNumber: number; }; + +export type MixerData = { + + mixerId: number; + mixerType: number; + mixerName: string; + micEQHi: number; + micEQLow: number; + masterAudioLevel: number; + masterFaderLevel: number; + linkCueA: number; + linkCueB: number; + masterFilter: number; + masterCueA: number; + masterCueB: number; + masterIsolatorOnOff: number; + masterIsolatorHi: number; + masterIsolatorMid: number; + masterIsolatorLow: number; + filterHPF: number; + filterLPF: number; + filterRes: number; + sendFXEffect: number; + sendFXExt1: number; + sendFXExt2: number; + sendFXMasterMix: number; + sendFXSizeFeedback: number; + sendFXTime: number; + sendFXHPF: number; + sendFXLevel: number; + sendReturn3SourceSelect: number; + sendReturn3Type: number; + sendReturn3OnOff: number; + sendReturn3Level: number; + channelFaderCurve: number; + crossFaderCurve: number; + crossFader: number; + beatFxOnOff: number; + beatFxLevelDepth: number; + beatFxChannelSelect: number; + beatFxSelect: number; + beatFxFreqHi: number; + beatFxFreqMid: number; + beatFxFreqLow: number; + headphonesPreEq: number; + headphonesALevel: number; + headphonesAMix: number; + headphonesBLevel: number; + headphonesBMix: number; + boothLevel: number; + boothEqHi: number; + boothEqLow: number; + +} \ No newline at end of file diff --git a/src/tcnet.ts b/src/tcnet.ts index aba53a5..acd8ed4 100644 --- a/src/tcnet.ts +++ b/src/tcnet.ts @@ -18,7 +18,7 @@ export class TCNetConfiguration { appName = "NODE-TCNET"; broadcastInterface: string | null = null; broadcastAddress = "255.255.255.255"; - requestTimeout = 2000; + requestTimeout = 200000; debug = true; } @@ -93,13 +93,13 @@ export class TCNetClient extends EventEmitter { /** * Disconnects from TCNet network */ - public disconnect(): void { - clearInterval(this.announcementInterval); + public disconnect(): void { + clearInterval(this.announcementInterval); this.optOut(); this.broadcastSocket.close(); this.unicastSocket.close(); this.timestampSocket.close(); - this.removeAllListeners(); + this.removeAllListeners(); //this.connected = false; } @@ -186,7 +186,7 @@ export class TCNetClient extends EventEmitter { this.emit("broadcast", packet); } } else { - if (this.config.debug) console.log("Unknown broadcast packet type: " + mgmtHeader.messageType ); + if (this.config.debug) console.log("Unknown broadcast packet type: " + mgmtHeader.messageType); } } @@ -200,6 +200,7 @@ export class TCNetClient extends EventEmitter { const mgmtHeader = new nw.TCNetManagementHeader(msg); mgmtHeader.read(); const packet = this.parsePacket(mgmtHeader); + if (this.config.debug) console.log(mgmtHeader.messageType); if (packet instanceof nw.TCNetDataPacket) { const dataPacketClass = nw.TCNetDataPackets[packet.dataType]; @@ -230,7 +231,7 @@ export class TCNetClient extends EventEmitter { } } } else { - if (this.config.debug) console.log("Unknown packet type: " + mgmtHeader.messageType + mgmtHeader.nodeOptions + mgmtHeader.buffer.toString()); + if (this.config.debug) console.log("Unknown packet type: " + mgmtHeader.messageType + " --- " + mgmtHeader.nodeOptions + " --- " + mgmtHeader.buffer.toString()); } }