{"id":25059389,"url":"https://github.com/glindstedt/vsrs","last_synced_at":"2025-04-14T13:20:28.265Z","repository":{"id":57671772,"uuid":"303197556","full_name":"glindstedt/vsrs","owner":"glindstedt","description":"Tool for creating sample streams for the Volca Sample","archived":false,"fork":false,"pushed_at":"2021-01-03T16:50:11.000Z","size":123,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-08T19:51:05.214Z","etag":null,"topics":["korg","volca","volca-sample"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/glindstedt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-10-11T19:32:56.000Z","updated_at":"2022-06-02T19:29:31.000Z","dependencies_parsed_at":"2022-08-30T16:00:24.308Z","dependency_job_id":null,"html_url":"https://github.com/glindstedt/vsrs","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glindstedt%2Fvsrs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glindstedt%2Fvsrs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glindstedt%2Fvsrs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glindstedt%2Fvsrs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/glindstedt","download_url":"https://codeload.github.com/glindstedt/vsrs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248886334,"owners_count":21177645,"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":["korg","volca","volca-sample"],"created_at":"2025-02-06T15:05:42.743Z","updated_at":"2025-04-14T13:20:28.241Z","avatar_url":"https://github.com/glindstedt.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"vsrs\n====\n\n[![Latest Version]][crates.io] [![Documentation]][docs.rs]\n\nCommand line utility for generating sample streams for the Volca Sample\n\nUsing a configuration file you configure which samples to use, which indexes to put them in,\nand whether samples should be compressed. You can also generate a stream with the factory\npreset samples by using a .alldata file.\n\nThe tool outputs a `.wav` file which is ready to\nbe used for transferring the data to the Volca Sample. For details on the transfer process refer to\n[transferring syrostream to your volca sample](https://github.com/korginc/volcasample#6-transferring-syrostream-to-your-volca-sample)\n\n# Installing\n\nYou need to have [Rust](https://www.rust-lang.org) installed, see\n[https://www.rust-lang.org/tools/install](https://www.rust-lang.org/tools/install)\nfor installation instructions.\n\n```shell\ncargo install vsrs\n```\n\n# Running\n\nLoading a configuration file\n\n```shell\nvsrs load example.ron\n```\n\nRestoring factory settings using a .alldata file.\nFiles can be found at\n[https://github.com/korginc/volcasample/tree/master/alldata](https://github.com/korginc/volcasample/tree/master/alldata)\n\n```shell\nvsrs reset all_sample_preset.alldata\n```\n\nTo play the `.wav` file from the command line you can use `aplay` on Linux, or `afplay` on macOs.\n**WARNING: do not play over speakers, make sure you've set up audio correctly to play into the volca first!**\n\n## Gotchas\n\n* It's good practice to wipe the sample memory with `all_sample_empty.alldata`\n  before loading new samples, otherwise there's a higher risk of getting a\n  memory full error.\n\n## Practical Examples\n\nCheck out the [contrib](./contrib) directory for configuration file examples.\n\n# Configuration format\n\nSupported configuration formats:\n* [RON](#ron) (See [https://github.com/ron-rs/ron](https://github.com/ron-rs/ron))\n* [JSON](#json)\n* [YAML](#yaml)\n\n## RON\n\n```rust\n// example.ron\n#![enable(implicit_some)]\nVolcaSample(\n    // optional, valid values are 8-16\n    default_compression: 16,\n    // map which supports keys in the range 0-99\n    samples: {\n        // Put kick.wav at sample index 0, and compress it to a bit depth of 8\n        0: Sample((\n            // the file path is relative to the location of the configuration file\n            file: \"kick.wav\",\n            // optional, valid values are 8-16\n            compression: 8,\n        )),\n        // Erase the sample at index 1\n        1: Erase,\n    },\n    // sets the default part setting for the reverb function\n    // optional, on or off (off if not specified)\n    default_part_reverb: on,\n    // map of sequence patterns, valid keys are 0-9\n    patterns: {\n        0: (\n            // map of pattern parts, valid keys are 0-9\n            parts: {\n                0: (\n                    // the sample to use for this part, valid values are 0-99\n                    sample: 0,\n                    // sequence steps, 1 = on, 0 = off\n                    steps: [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1],\n                    // part toggle options, all optional\n                    loop: on,\n                    reverb: off,\n                    reverse: on,\n                    motion: on,\n                    mute: off,\n                    // part parameters, all optional\n                    level: 127,          // 0-127 (127)\n                    pan: 64,             // 1-127 (64=center) (64)\n                    speed: 64,           // semitone = 40-88 (64=center) (64), continuous = 129-255 (192=center)\n                    amp_eg_attack: 64,   // 0-127 (0)\n                    amp_eg_decay: 64,    // 0-127 (127)\n                    pitch_eg_int: 64,    // 1-127 (64=center) (64)\n                    pitch_eg_attack: 64, // 0-127 (0)\n                    pitch_eg_decay: 64,  // 0-127 (127)\n                    starting_point: 64,  // 0-127 (0)\n                    length: 64,          // 0-127 (127)\n                    hi_cut: 64,          // 0-127 (127)\n                    // motion sequences for the part, optional\n                    motion_sequences: (\n                        // valid values: 0-127\n                        level_start: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],\n                        level_end: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],\n                        // valid values: 1-127\n                        pan_start: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],\n                        pan_end: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],\n                        // valid values: semitone = 40-88, continuous = 129-255\n                        speed_start: [40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85],\n                        speed_end: [129, 137, 145, 153, 161, 169, 177, 185, 193, 201, 209, 217, 225, 233, 241, 249],\n                        // valid values: 0-127\n                        amp_eg_attack: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],\n                        amp_eg_decay: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],\n                        // valid values: 1-127\n                        pitch_eg_int: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],\n                        // valid values: 0-127\n                        pitch_eg_attack: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],\n                        pitch_eg_decay: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],\n                        start_point: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],\n                        length: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],\n                        hi_cut: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],\n                    ),\n                ),\n            },\n        ),\n    },\n)\n```\n\n## JSON\n\nSee the [RON](#ron) section for more details about the values\n\n```json\n{\n  \"default_compression\": 16,\n  \"samples\": {\n    \"0\": {\n      \"Sample\": {\n          \"file\": \"kick.wav\",\n          \"compression\": 8\n      }\n    },\n    \"1\": \"Erase\"\n  },\n  \"default_part_reverb\": \"on\",\n  \"patterns\": {\n    \"0\": {\n      \"parts\": {\n        \"0\": {\n          \"sample\": 0,\n          \"steps\": [ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 ],\n          \"motion\": \"off\",\n          \"loop\": \"on\",\n          \"reverb\": \"off\",\n          \"reverse\": \"on\",\n          \"mute\": \"off\",\n          \"level\": 127,\n          \"pan\": 64,\n          \"speed\": 64,\n          \"amp_eg_attack\": 64,\n          \"amp_eg_decay\": 64,\n          \"pitch_eg_int\": 64,\n          \"pitch_eg_attack\": 64,\n          \"pitch_eg_decay\": 64,\n          \"starting_point\": 64,\n          \"length\": 64,\n          \"hi_cut\": 64,\n          \"motion_sequences\": {\n            \"level_start\": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],\n            \"level_end\": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],\n            \"pan_start\": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],\n            \"pan_end\": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],\n            \"speed_start\": [ 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85 ],\n            \"speed_end\": [ 129, 137, 145, 153, 161, 169, 177, 185, 193, 201, 209, 217, 225, 233, 241, 249 ],\n            \"amp_eg_attack\": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],\n            \"amp_eg_decay\": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],\n            \"pitch_eg_int\": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],\n            \"pitch_eg_attack\": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],\n            \"pitch_eg_decay\": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],\n            \"start_point\": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],\n            \"length\": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],\n            \"hi_cut\": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]\n          }\n        }\n      }\n    }\n  }\n}\n```\n\n## YAML\n\nSee the [RON](#ron) section for more details about the values\n\n```yaml\ndefault_compression: 16\nsamples:\n  0:\n    Sample:\n      file: kick.wav\n      compression: 8\n  1: Erase\ndefault_part_reverb: on\npatterns:\n  0:\n    parts:\n      0:\n        sample: 0\n        steps: [ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 ]\n        motion: off\n        loop: on\n        reverb: off\n        reverse: on\n        mute: off\n        level: 127\n        pan: 64\n        speed: 64\n        amp_eg_attack: 64\n        amp_eg_decay: 64\n        pitch_eg_int: 64\n        pitch_eg_attack: 64\n        pitch_eg_decay: 64\n        starting_point: 64\n        length: 64\n        hi_cut: 64\n        motion_sequences:\n          level_start: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]\n          level_end: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]\n          pan_start: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]\n          pan_end: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]\n          speed_start: [ 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85 ]\n          speed_end: [ 129, 137, 145, 153, 161, 169, 177, 185, 193, 201, 209, 217, 225, 233, 241, 249 ]\n          amp_eg_attack: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]\n          amp_eg_decay: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]\n          pitch_eg_int: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]\n          pitch_eg_attack: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]\n          pitch_eg_decay: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]\n          start_point: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]\n          length: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]\n          hi_cut: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]\n```\n\n[docs.rs]: https://docs.rs/vsrs\n[crates.io]: https://crates.io/crates/vsrs\n[Documentation]: https://docs.rs/vsrs/badge.svg\n[Latest Version]: https://img.shields.io/crates/v/vsrs","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fglindstedt%2Fvsrs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fglindstedt%2Fvsrs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fglindstedt%2Fvsrs/lists"}