An open API service indexing awesome lists of open source software.

https://github.com/glindstedt/vsrs

Tool for creating sample streams for the Volca Sample
https://github.com/glindstedt/vsrs

korg volca volca-sample

Last synced: about 1 year ago
JSON representation

Tool for creating sample streams for the Volca Sample

Awesome Lists containing this project

README

          

vsrs
====

[![Latest Version]][crates.io] [![Documentation]][docs.rs]

Command line utility for generating sample streams for the Volca Sample

Using a configuration file you configure which samples to use, which indexes to put them in,
and whether samples should be compressed. You can also generate a stream with the factory
preset samples by using a .alldata file.

The tool outputs a `.wav` file which is ready to
be used for transferring the data to the Volca Sample. For details on the transfer process refer to
[transferring syrostream to your volca sample](https://github.com/korginc/volcasample#6-transferring-syrostream-to-your-volca-sample)

# Installing

You need to have [Rust](https://www.rust-lang.org) installed, see
[https://www.rust-lang.org/tools/install](https://www.rust-lang.org/tools/install)
for installation instructions.

```shell
cargo install vsrs
```

# Running

Loading a configuration file

```shell
vsrs load example.ron
```

Restoring factory settings using a .alldata file.
Files can be found at
[https://github.com/korginc/volcasample/tree/master/alldata](https://github.com/korginc/volcasample/tree/master/alldata)

```shell
vsrs reset all_sample_preset.alldata
```

To play the `.wav` file from the command line you can use `aplay` on Linux, or `afplay` on macOs.
**WARNING: do not play over speakers, make sure you've set up audio correctly to play into the volca first!**

## Gotchas

* It's good practice to wipe the sample memory with `all_sample_empty.alldata`
before loading new samples, otherwise there's a higher risk of getting a
memory full error.

## Practical Examples

Check out the [contrib](./contrib) directory for configuration file examples.

# Configuration format

Supported configuration formats:
* [RON](#ron) (See [https://github.com/ron-rs/ron](https://github.com/ron-rs/ron))
* [JSON](#json)
* [YAML](#yaml)

## RON

```rust
// example.ron
#![enable(implicit_some)]
VolcaSample(
// optional, valid values are 8-16
default_compression: 16,
// map which supports keys in the range 0-99
samples: {
// Put kick.wav at sample index 0, and compress it to a bit depth of 8
0: Sample((
// the file path is relative to the location of the configuration file
file: "kick.wav",
// optional, valid values are 8-16
compression: 8,
)),
// Erase the sample at index 1
1: Erase,
},
// sets the default part setting for the reverb function
// optional, on or off (off if not specified)
default_part_reverb: on,
// map of sequence patterns, valid keys are 0-9
patterns: {
0: (
// map of pattern parts, valid keys are 0-9
parts: {
0: (
// the sample to use for this part, valid values are 0-99
sample: 0,
// sequence steps, 1 = on, 0 = off
steps: [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
// part toggle options, all optional
loop: on,
reverb: off,
reverse: on,
motion: on,
mute: off,
// part parameters, all optional
level: 127, // 0-127 (127)
pan: 64, // 1-127 (64=center) (64)
speed: 64, // semitone = 40-88 (64=center) (64), continuous = 129-255 (192=center)
amp_eg_attack: 64, // 0-127 (0)
amp_eg_decay: 64, // 0-127 (127)
pitch_eg_int: 64, // 1-127 (64=center) (64)
pitch_eg_attack: 64, // 0-127 (0)
pitch_eg_decay: 64, // 0-127 (127)
starting_point: 64, // 0-127 (0)
length: 64, // 0-127 (127)
hi_cut: 64, // 0-127 (127)
// motion sequences for the part, optional
motion_sequences: (
// valid values: 0-127
level_start: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],
level_end: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],
// valid values: 1-127
pan_start: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],
pan_end: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],
// valid values: semitone = 40-88, continuous = 129-255
speed_start: [40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85],
speed_end: [129, 137, 145, 153, 161, 169, 177, 185, 193, 201, 209, 217, 225, 233, 241, 249],
// valid values: 0-127
amp_eg_attack: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],
amp_eg_decay: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],
// valid values: 1-127
pitch_eg_int: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],
// valid values: 0-127
pitch_eg_attack: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],
pitch_eg_decay: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],
start_point: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],
length: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],
hi_cut: [1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120],
),
),
},
),
},
)
```

## JSON

See the [RON](#ron) section for more details about the values

```json
{
"default_compression": 16,
"samples": {
"0": {
"Sample": {
"file": "kick.wav",
"compression": 8
}
},
"1": "Erase"
},
"default_part_reverb": "on",
"patterns": {
"0": {
"parts": {
"0": {
"sample": 0,
"steps": [ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 ],
"motion": "off",
"loop": "on",
"reverb": "off",
"reverse": "on",
"mute": "off",
"level": 127,
"pan": 64,
"speed": 64,
"amp_eg_attack": 64,
"amp_eg_decay": 64,
"pitch_eg_int": 64,
"pitch_eg_attack": 64,
"pitch_eg_decay": 64,
"starting_point": 64,
"length": 64,
"hi_cut": 64,
"motion_sequences": {
"level_start": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],
"level_end": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],
"pan_start": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],
"pan_end": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],
"speed_start": [ 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85 ],
"speed_end": [ 129, 137, 145, 153, 161, 169, 177, 185, 193, 201, 209, 217, 225, 233, 241, 249 ],
"amp_eg_attack": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],
"amp_eg_decay": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],
"pitch_eg_int": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],
"pitch_eg_attack": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],
"pitch_eg_decay": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],
"start_point": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],
"length": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ],
"hi_cut": [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]
}
}
}
}
}
}
```

## YAML

See the [RON](#ron) section for more details about the values

```yaml
default_compression: 16
samples:
0:
Sample:
file: kick.wav
compression: 8
1: Erase
default_part_reverb: on
patterns:
0:
parts:
0:
sample: 0
steps: [ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 ]
motion: off
loop: on
reverb: off
reverse: on
mute: off
level: 127
pan: 64
speed: 64
amp_eg_attack: 64
amp_eg_decay: 64
pitch_eg_int: 64
pitch_eg_attack: 64
pitch_eg_decay: 64
starting_point: 64
length: 64
hi_cut: 64
motion_sequences:
level_start: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]
level_end: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]
pan_start: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]
pan_end: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]
speed_start: [ 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85 ]
speed_end: [ 129, 137, 145, 153, 161, 169, 177, 185, 193, 201, 209, 217, 225, 233, 241, 249 ]
amp_eg_attack: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]
amp_eg_decay: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]
pitch_eg_int: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]
pitch_eg_attack: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]
pitch_eg_decay: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]
start_point: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]
length: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]
hi_cut: [ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 ]
```

[docs.rs]: https://docs.rs/vsrs
[crates.io]: https://crates.io/crates/vsrs
[Documentation]: https://docs.rs/vsrs/badge.svg
[Latest Version]: https://img.shields.io/crates/v/vsrs