{"id":16188290,"url":"https://github.com/konsumer/beatstep","last_synced_at":"2025-03-19T03:30:40.813Z","repository":{"id":42692038,"uuid":"238311025","full_name":"konsumer/beatstep","owner":"konsumer","description":"intercept beatstep and make it work in different ways","archived":false,"fork":false,"pushed_at":"2023-01-06T15:53:24.000Z","size":885,"stargazers_count":22,"open_issues_count":11,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-15T23:36:33.660Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/konsumer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-02-04T21:30:47.000Z","updated_at":"2024-11-04T08:29:45.000Z","dependencies_parsed_at":"2023-02-06T06:16:51.455Z","dependency_job_id":null,"html_url":"https://github.com/konsumer/beatstep","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/konsumer%2Fbeatstep","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/konsumer%2Fbeatstep/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/konsumer%2Fbeatstep/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/konsumer%2Fbeatstep/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/konsumer","download_url":"https://codeload.github.com/konsumer/beatstep/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244350674,"owners_count":20439284,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-10T07:25:49.739Z","updated_at":"2025-03-19T03:30:40.427Z","avatar_url":"https://github.com/konsumer.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WIP\n\nI haven't really worked out the sequencer fully. I think I know how I want it to work, but haven't written the code to make it work that way. I think the lib is still useful as it is, to make things (I have all the known sysex commands worked out, etc) but it will need some more work to be a functional sequencer.\n\n## BeatStep Interceptor\n\n[![new beatstep sequencer](http://img.youtube.com/vi/WsXOr8mA1gY/0.jpg)](https://www.youtube.com/watch?v=WsXOr8mA1gY \"See it in action\")\n\nThis is a command-line program to make the Arturia BeatStep work in different ways than the firmware is meant to.\n\nThe Arturia BeatStep is a really nice-feeling device, that is pretty cheap (~$100 new.) The built-in firmware for the device is OK, but a bit wonky for sequencing complex drum-patterns. Since I don't have access to the firmware's source, I made this so I'd have a sequencer that works how I want. You can also use it as a command-line program to load/save beatstep preset files (even on linux, which the official software doesn't support.)\n\nIt starts a virtual midi device that can be plugged into other software.\n\n\u003e **IMPORTANT** Using the sequencer will set your device up with specifc mappings and stuff, so make sure to back up your beatstep settings in the MIDI Control Center (from Arturia) program, or use `STORE`/`RECALL` buttons on device, or use `save`/`load` in CLI, if you care about them.\n\n## installation\n\n```bash\nnpm i -g beatstep\n```\n\nYou can also run it without installing:\n\n```bash\nnpx beatstep list\n```\n\n## usage\n\n### command-line\n\n```bash\nbeatstep \u003ccommand\u003e\n\nCommands:\n  beatstep load \u003cfile\u003e  Load a .beatstep preset file\n  beatstep save \u003cfile\u003e  Save a .beatstep preset file\n  beatstep list         List MIDI devices\n  beatstep seq          Start sequencer\n\nOptions:\n  --help     Show help                                                 [boolean]\n  --version  Show version number                                       [boolean]\n```\n\nCommands have more options. If you want to know more about it, run `beatstep \u003ccommand\u003e --help`\n\n### interaction\n\nI am still working on this part. Here is how it currently works:\n\n- run `beatstep seq` to start the sequencer\n- Make sure controller is in `CNTRL` mode (red) and turn on `EXT SYNC` (blue)\n- Press `SHIFT` to chose pattern\n- Press `STOP` to choose track\n- `PLAY` will play/stop the current pattern\n- `LEVEL/RATE` sets the speed of the sequencer.\n\nThe notes it sends out are based on [hydrogen](http://hydrogen-music.org/) drumkits, which is a common mapping for drumkit-instruments starting at `C1` with a kick drum. Eventually, I can make this a configurable option (like a CLI flag that you can tell it the notes it can use for each track.)\n\n## as a library\n\nYou can also use this as a nice BeatStep interface, in your own code\n\nThe class constructor has 2 params, which are the names of input and output device (you can get with `require('easymidi').getInputs()` and `require('easymidi').getOutputs()`.)\n\n\n```js\nimport { getOutputs, getInputs } from 'easymidi'\nimport { BeatStep } from 'beatstep`\n\nconst beatstep = new BeatStep(\n  getInputs().find(d =\u003e d.includes('Arturia BeatStep')),\n  getOutputs().find(d =\u003e d.includes('Arturia BeatStep'))\n)\n\nbeatstep.on('noteon', console.log)\nbeatstep.on('noteoff', console.log)\n\n```\n\n## hardware\n\nEventually, I'd like to reprogram the chip on the controller to acheive a fully custom standalone sequencer.\n\nIt uses a [stm32f103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html) chip, with some supporting circuitry to multiplex all the buttons, leds, and knobs. It looks like they are using [hc574](https://www.ti.com/lit/ds/symlink/sn54hc574.pdf?ts=1587965539932) to multiplex rotoary-encoders, somehow. It looks like it has programming pins on board (`JP1`) but firmware updates over sysex would be preferrable. [This](https://medium.com/techmaker/reverse-engineering-stm32-firmware-578d53e79b3) might give me some ideas for reversing the firmware to the point that I can read inputs, output LEDs, and eventually just write my own interface.\n\nIdeally, I could compile my own code, create my own led file (appears to be hex) and send over sysex.\n\n\n### TODO\n\n* Fill in the docs: api \u0026 usage\n* Figure out `RATE` knob for BPM (currently works, but outputs the wrong BPM on console)\n* Figure out `CHAN` so I can use that to switch tracks and use `SHIFT` to do something else (commands like copy/paste and sequencer controls would be cool)\n* Use `STORE`/`RECALL` for something other than intended. Would be good to fire save/load (maybe combined with `SHIFT` and `STOP` for track/pattern/song)\n* Figure out easier-to-compile MIDI lib (for cross-platform release building)\n* Different seqquencer styles: current (all drums in one instrument on one channel), seperate drum instruments, seperate channels, something for melodies\n* A mode that is like ableton (record inputs on all pads/knobs and allow playback)\n* Better debugging: more stuff and print all midi messages sent/received\n\n## thanks\n\nI couldn't have made this without the awesome hacking in this [blog post](https://www.untergeek.de/2014/11/taming-arturias-beatstep-sysex-codes-for-programming-via-ipad/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkonsumer%2Fbeatstep","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkonsumer%2Fbeatstep","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkonsumer%2Fbeatstep/lists"}