diff --git a/repl/package-lock.json b/repl/package-lock.json index 74909c21..e6ab44ab 100644 --- a/repl/package-lock.json +++ b/repl/package-lock.json @@ -8,16 +8,16 @@ "@tonaljs/tonal": "^4.6.5", "codemirror": "^5.65.1", "estraverse": "^5.3.0", + "multimap": "^1.1.0", "react": "^17.0.2", "react-codemirror2": "^7.2.1", "react-dom": "^17.0.2", "shift-ast": "^6.1.0", "shift-codegen": "^7.0.3", - "shift-parser": "^7.0.3", - "shift-reducer": "6.0.0", + "shift-regexp-acceptor": "^2.0.3", "shift-spec": "^2018.0.2", - "shift-traverser": "^1.0.0", - "tone": "^14.7.77" + "tone": "^14.7.77", + "webmidi": "^2.5.2" }, "devDependencies": { "@snowpack/plugin-dotenv": "^2.1.0", @@ -7291,22 +7291,6 @@ "shift-reducer": "6.0.0" } }, - "node_modules/shift-parser": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/shift-parser/-/shift-parser-7.0.3.tgz", - "integrity": "sha512-uYX2ORyZfKZrUc4iKKkO9KOhzUSxCrSBk7QK6ZmShId+BOo1gh1IwecVy97ynyOTpmhPWUttjC8BzsnQl65Zew==", - "dependencies": { - "multimap": "^1.0.2", - "shift-ast": "6.0.0", - "shift-reducer": "6.0.0", - "shift-regexp-acceptor": "2.0.3" - } - }, - "node_modules/shift-parser/node_modules/shift-ast": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/shift-ast/-/shift-ast-6.0.0.tgz", - "integrity": "sha512-XXxDcEBWVBzqWXfNYJlLyJ1/9kMvOXVRXiqPjkOrTCC5qRsBvEMJMRLLFhU3tn8ue56Y7IZyBE6bexFum5QLUw==" - }, "node_modules/shift-reducer": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/shift-reducer/-/shift-reducer-6.0.0.tgz", @@ -7335,28 +7319,6 @@ "resolved": "https://registry.npmjs.org/shift-spec/-/shift-spec-2018.0.2.tgz", "integrity": "sha512-5CP/cKDEim4rZ6ViCSipTLY2U7HJr8q/kpDuCBmebFqbx/0DeozWO+9ienHmYjgGLDfHrqj+LBAN67FRK2vE6w==" }, - "node_modules/shift-traverser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shift-traverser/-/shift-traverser-1.0.0.tgz", - "integrity": "sha512-DMY3512wJbdC+IC+nhLH3/Stgr2BbxbNcg7qyZ6+e5qNnNs8TBQJWdMsRgHlX1JXwF4C0ONKS8VUxsPT0Tf7aw==", - "dependencies": { - "estraverse": "4.2.0", - "shift-spec": "2018.0.0" - } - }, - "node_modules/shift-traverser/node_modules/estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shift-traverser/node_modules/shift-spec": { - "version": "2018.0.0", - "resolved": "https://registry.npmjs.org/shift-spec/-/shift-spec-2018.0.0.tgz", - "integrity": "sha512-/aiPOkj7dbe+CV2VZhIMTHQToZmgniofpRG7Yr7x2/0sO6CSVC++py1Wzf+s+rWSTDHKcLvziVAxjRRV4i4EoQ==" - }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -8553,6 +8515,14 @@ "node": ">=12" } }, + "node_modules/webmidi": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/webmidi/-/webmidi-2.5.3.tgz", + "integrity": "sha512-PyMGvKcDGpvbQUfnmBORQJciyG3VAZ4aHlGy1iRZ3uEs4kG4HCvI7KRthUpM1vuHDPL98lidRIUaoRomkJtWtg==", + "engines": { + "node": ">0.6.x" + } + }, "node_modules/whatwg-url": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", @@ -14433,24 +14403,6 @@ "shift-reducer": "6.0.0" } }, - "shift-parser": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/shift-parser/-/shift-parser-7.0.3.tgz", - "integrity": "sha512-uYX2ORyZfKZrUc4iKKkO9KOhzUSxCrSBk7QK6ZmShId+BOo1gh1IwecVy97ynyOTpmhPWUttjC8BzsnQl65Zew==", - "requires": { - "multimap": "^1.0.2", - "shift-ast": "6.0.0", - "shift-reducer": "6.0.0", - "shift-regexp-acceptor": "2.0.3" - }, - "dependencies": { - "shift-ast": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/shift-ast/-/shift-ast-6.0.0.tgz", - "integrity": "sha512-XXxDcEBWVBzqWXfNYJlLyJ1/9kMvOXVRXiqPjkOrTCC5qRsBvEMJMRLLFhU3tn8ue56Y7IZyBE6bexFum5QLUw==" - } - } - }, "shift-reducer": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/shift-reducer/-/shift-reducer-6.0.0.tgz", @@ -14481,27 +14433,6 @@ "resolved": "https://registry.npmjs.org/shift-spec/-/shift-spec-2018.0.2.tgz", "integrity": "sha512-5CP/cKDEim4rZ6ViCSipTLY2U7HJr8q/kpDuCBmebFqbx/0DeozWO+9ienHmYjgGLDfHrqj+LBAN67FRK2vE6w==" }, - "shift-traverser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shift-traverser/-/shift-traverser-1.0.0.tgz", - "integrity": "sha512-DMY3512wJbdC+IC+nhLH3/Stgr2BbxbNcg7qyZ6+e5qNnNs8TBQJWdMsRgHlX1JXwF4C0ONKS8VUxsPT0Tf7aw==", - "requires": { - "estraverse": "4.2.0", - "shift-spec": "2018.0.0" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "shift-spec": { - "version": "2018.0.0", - "resolved": "https://registry.npmjs.org/shift-spec/-/shift-spec-2018.0.0.tgz", - "integrity": "sha512-/aiPOkj7dbe+CV2VZhIMTHQToZmgniofpRG7Yr7x2/0sO6CSVC++py1Wzf+s+rWSTDHKcLvziVAxjRRV4i4EoQ==" - } - } - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -15420,6 +15351,11 @@ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true }, + "webmidi": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/webmidi/-/webmidi-2.5.3.tgz", + "integrity": "sha512-PyMGvKcDGpvbQUfnmBORQJciyG3VAZ4aHlGy1iRZ3uEs4kG4HCvI7KRthUpM1vuHDPL98lidRIUaoRomkJtWtg==" + }, "whatwg-url": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", diff --git a/repl/package.json b/repl/package.json index b55e1139..27414e0f 100644 --- a/repl/package.json +++ b/repl/package.json @@ -12,13 +12,16 @@ "@tonaljs/tonal": "^4.6.5", "codemirror": "^5.65.1", "estraverse": "^5.3.0", + "multimap": "^1.1.0", "react": "^17.0.2", "react-codemirror2": "^7.2.1", "react-dom": "^17.0.2", "shift-ast": "^6.1.0", "shift-codegen": "^7.0.3", + "shift-regexp-acceptor": "^2.0.3", "shift-spec": "^2018.0.2", - "tone": "^14.7.77" + "tone": "^14.7.77", + "webmidi": "^2.5.2" }, "devDependencies": { "@snowpack/plugin-dotenv": "^2.1.0", diff --git a/repl/src/App.tsx b/repl/src/App.tsx index ad54944b..375e29cd 100644 --- a/repl/src/App.tsx +++ b/repl/src/App.tsx @@ -9,6 +9,7 @@ import * as parser from './parse'; import CodeMirror from './CodeMirror'; import hot from '../public/hot'; import { isNote } from 'tone'; +import { useWebMidi } from './midi'; const { tetris, tetrisRev, shapeShifted } = tunes; const { parse } = parser; @@ -132,6 +133,18 @@ function App() { logBox.current.scrollTop = logBox.current?.scrollHeight; }, [log]); + useWebMidi({ + ready: useCallback(({ outputs }) => { + pushLog(`WebMidi ready! Just add .midi(${outputs.map((o) => `"${o.name}"`).join(' | ')}) to the pattern. `); + }, []), + connected: useCallback(({ outputs }) => { + pushLog(`Midi device connected! Available: ${outputs.map((o) => `"${o.name}"`).join(', ')}`); + }, []), + disconnected: useCallback(({ outputs }) => { + pushLog(`Midi device disconnected! Available: ${outputs.map((o) => `"${o.name}"`).join(', ')}`); + }, []), + }); + return (