Build step 2 of the brief: an M4L device that observes root_note / scale_name / scale_intervals in the Live Object Model and prints the QWERTY keys the scale maps to. No lighting yet — that is step 3. LiveAPI only exists inside Max's js objects, so max/scale-observer.js (plain ES5, the one uncompiled file here) observes the LOM and forwards raw values as flat messages; src/max/device.ts resolves them, keeping every decision in TypeScript and testable off the hardware. Follows the Song's scale by default and the selected clip's on request, since the brief left that decision open. scale_intervals only exists from Live 12.1, so scale_name resolves against a table of Live's built-ins as a fallback; reported intervals always win. Ships a .maxpat rather than an .amxd because an .amxd has to be created from inside Live — the README has the paste-into-a-new-device steps. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
32 lines
820 B
JSON
32 lines
820 B
JSON
{
|
|
"name": "steelseries-live-scale",
|
|
"version": "0.1.0",
|
|
"description": "Highlight the notes of the current Ableton Live scale on a SteelSeries Apex 7 via GameSense",
|
|
"main": "dist/src/index.js",
|
|
"types": "dist/src/index.d.ts",
|
|
"bin": {
|
|
"apex7-scale": "bin/apex7-scale.js"
|
|
},
|
|
"files": [
|
|
"bin",
|
|
"dist/src"
|
|
],
|
|
"scripts": {
|
|
"build": "tsc",
|
|
"typecheck": "tsc --noEmit",
|
|
"prepare": "npm run build",
|
|
"start": "npm run build && node bin/apex7-scale.js",
|
|
"stub": "npm run build && node dist/tools/fake-gamesense.js",
|
|
"test": "npm run build && node dist/test/logic.test.js && node dist/test/live.test.js"
|
|
},
|
|
"engines": {
|
|
"node": ">=16"
|
|
},
|
|
"license": "MIT",
|
|
"private": true,
|
|
"devDependencies": {
|
|
"@types/node": "^26.2.0",
|
|
"typescript": "^7.0.2"
|
|
}
|
|
}
|