Fix: continue to fix release build and CI
This commit is contained in:
12
.github/workflows/ci.yml
vendored
12
.github/workflows/ci.yml
vendored
@@ -70,7 +70,6 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System'
|
choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System'
|
||||||
echo "C:\Program Files\CMake\bin" >> $env:GITHUB_PATH
|
echo "C:\Program Files\CMake\bin" >> $env:GITHUB_PATH
|
||||||
cargo install cargo-bundle
|
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: cargo build --release --target ${{ matrix.target }}
|
run: cargo build --release --target ${{ matrix.target }}
|
||||||
@@ -79,6 +78,7 @@ jobs:
|
|||||||
run: cargo build --release --features desktop --bin cagire-desktop --target ${{ matrix.target }}
|
run: cargo build --release --features desktop --bin cagire-desktop --target ${{ matrix.target }}
|
||||||
|
|
||||||
- name: Bundle desktop app
|
- name: Bundle desktop app
|
||||||
|
if: runner.os != 'Windows'
|
||||||
run: cargo bundle --release --features desktop --bin cagire-desktop --target ${{ matrix.target }}
|
run: cargo bundle --release --features desktop --bin cagire-desktop --target ${{ matrix.target }}
|
||||||
|
|
||||||
- name: Upload artifact (Unix)
|
- name: Upload artifact (Unix)
|
||||||
@@ -109,12 +109,12 @@ jobs:
|
|||||||
name: ${{ matrix.artifact }}-desktop
|
name: ${{ matrix.artifact }}-desktop
|
||||||
path: target/${{ matrix.target }}/release/bundle/osx/Cagire.app
|
path: target/${{ matrix.target }}/release/bundle/osx/Cagire.app
|
||||||
|
|
||||||
- name: Upload desktop artifact (Windows MSI)
|
- name: Upload desktop artifact (Windows exe)
|
||||||
if: runner.os == 'Windows'
|
if: runner.os == 'Windows'
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.artifact }}-desktop
|
name: ${{ matrix.artifact }}-desktop
|
||||||
path: target/${{ matrix.target }}/release/bundle/msi/*.msi
|
path: target/${{ matrix.target }}/release/cagire-desktop.exe
|
||||||
|
|
||||||
release:
|
release:
|
||||||
needs: build
|
needs: build
|
||||||
@@ -137,12 +137,12 @@ jobs:
|
|||||||
name=$(basename "$dir")
|
name=$(basename "$dir")
|
||||||
if [[ "$name" == *-desktop ]]; then
|
if [[ "$name" == *-desktop ]]; then
|
||||||
base="${name%-desktop}"
|
base="${name%-desktop}"
|
||||||
if ls "$dir"/*.msi 1>/dev/null 2>&1; then
|
if ls "$dir"/*.deb 1>/dev/null 2>&1; then
|
||||||
cp "$dir"/*.msi "release/${base}-desktop.msi"
|
|
||||||
elif ls "$dir"/*.deb 1>/dev/null 2>&1; then
|
|
||||||
cp "$dir"/*.deb "release/${base}-desktop.deb"
|
cp "$dir"/*.deb "release/${base}-desktop.deb"
|
||||||
elif [ -d "$dir/Cagire.app" ]; then
|
elif [ -d "$dir/Cagire.app" ]; then
|
||||||
(cd "$dir" && zip -r "../../release/${base}-desktop.app.zip" Cagire.app)
|
(cd "$dir" && zip -r "../../release/${base}-desktop.app.zip" Cagire.app)
|
||||||
|
elif [ -f "$dir/cagire-desktop.exe" ]; then
|
||||||
|
cp "$dir/cagire-desktop.exe" "release/${base}-desktop.exe"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
if [ -f "$dir/cagire.exe" ]; then
|
if [ -f "$dir/cagire.exe" ]; then
|
||||||
|
|||||||
@@ -1,73 +0,0 @@
|
|||||||
# Audio Engine
|
|
||||||
|
|
||||||
Cagire uses **Doux** as its audio engine ([https://doux.livecoding.fr](https://doux.livecoding.fr)). Doux is a standalone synthesis and sampling engine that receives commands as strings and turns them into sound. Doux is a fixed graph synthesizer, which means that the structure of the sound is defined by a fixed set of nodes and connections, and the parameters of these nodes can be adjusted to create different sounds. Doux is extremely versatile and you are likely to find it useful for a wide range of musical styles and genres.
|
|
||||||
|
|
||||||
## How Sound is Produced
|
|
||||||
|
|
||||||
When the sequencer hits an active step, the Forth script is compiled and executed. Each emit operation (`.`) generates a command string that is sent to Doux. The command encodes the sound name and all accumulated parameters. The following example script:
|
|
||||||
|
|
||||||
```
|
|
||||||
"saw" sound c4 note 0.5 gain 2000 lpf .
|
|
||||||
```
|
|
||||||
|
|
||||||
will produce a command string that Doux interprets to _play a saw wave at C4 with gain 0.5 and a 2kHz lowpass filter_.
|
|
||||||
|
|
||||||
## Sound sources
|
|
||||||
|
|
||||||
Each sound needs a source. Sources are defined by typing their name followed by the `sound` keyword. Sources are raw waveforms or samples. They are shaped by passing additional parameters that will modify the characteristics of the sound: envelopes, effects, synthesis options, etc. The following example defines a source named `saw` with a frequency of 440 Hz, a gain of 0.5 and some reverb:
|
|
||||||
|
|
||||||
```
|
|
||||||
"saw" source 440 freq 0.5 gain 0.5 verb .
|
|
||||||
```
|
|
||||||
|
|
||||||
The audio engine offers a vast array (~20+) of sources including oscillators, noises, live input, and more.
|
|
||||||
|
|
||||||
## Settings
|
|
||||||
|
|
||||||
- **Channels**: Output channel count (1-64)
|
|
||||||
- **Buffer Size**: Audio buffer in samples (64-4096). Lower values reduce latency but increase CPU load.
|
|
||||||
- **Voices**: Maximum polyphony (1-128, default 32). When the limit is reached, the oldest voice is stolen.
|
|
||||||
|
|
||||||
Settings are persisted across sessions.
|
|
||||||
|
|
||||||
## Samples
|
|
||||||
|
|
||||||
Cagire scans sample directories recursively and indexes all audio files. Add sample paths on the Engine page with **a**, remove with **d**. Use samples in scripts by name:
|
|
||||||
|
|
||||||
```
|
|
||||||
"kick" s .
|
|
||||||
"hat" s 0.5 gain .
|
|
||||||
```
|
|
||||||
|
|
||||||
The sample index is shown on the Engine page with the total count.
|
|
||||||
|
|
||||||
## Visualizers
|
|
||||||
|
|
||||||
The Engine page displays two real-time visualizers:
|
|
||||||
|
|
||||||
- **Scope**: Waveform display (64 samples), updated on every audio callback
|
|
||||||
- **Spectrum**: 32-band FFT analyzer with logarithmic frequency scaling (20Hz to Nyquist), Hann window, displayed in dB
|
|
||||||
|
|
||||||
Both can be toggled on or off in the Options page.
|
|
||||||
|
|
||||||
## Monitoring
|
|
||||||
|
|
||||||
The Engine page shows live metrics:
|
|
||||||
|
|
||||||
- **Active voices**: Current polyphony count
|
|
||||||
- **Peak voices**: Highest voice count since last reset (press **r** to reset)
|
|
||||||
- **CPU load**: Audio thread utilization
|
|
||||||
- **Events**: Total emitted and dropped event counts
|
|
||||||
|
|
||||||
## Tempo Scaling
|
|
||||||
|
|
||||||
Some parameters are automatically scaled by step duration so they sound consistent across tempos. These include envelope times (attack, decay, release), filter envelopes, pitch envelopes, FM envelopes, glide, and reverb/delay times.
|
|
||||||
|
|
||||||
## Commands
|
|
||||||
|
|
||||||
On the Engine page:
|
|
||||||
|
|
||||||
- **h**: Hush (graceful fade-out of all voices)
|
|
||||||
- **p**: Panic (hard stop all voices immediately)
|
|
||||||
- **r**: Reset peak voice counter
|
|
||||||
- **t**: Test sound (plays a 440Hz sine)
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# Effects
|
|
||||||
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
# Keybindings
|
|
||||||
|
|
||||||
## Navigation
|
|
||||||
|
|
||||||
- **Ctrl+Left/Right**: Switch between pages (Main, Audio, Doc)
|
|
||||||
- **q**: Quit (with confirmation)
|
|
||||||
|
|
||||||
## Main Page - Sequencer Focus
|
|
||||||
|
|
||||||
- **Arrow keys**: Navigate steps in pattern
|
|
||||||
- **Enter**: Toggle step active/inactive
|
|
||||||
- **Tab**: Switch focus to editor
|
|
||||||
- **Space**: Play/pause
|
|
||||||
|
|
||||||
### Pattern Controls
|
|
||||||
|
|
||||||
- **< / >**: Decrease/increase pattern length
|
|
||||||
- **[ / ]**: Decrease/increase pattern speed
|
|
||||||
- **p**: Open pattern picker
|
|
||||||
- **b**: Open bank picker
|
|
||||||
|
|
||||||
### Slots
|
|
||||||
|
|
||||||
- **1-8**: Toggle slot on/off
|
|
||||||
- **g**: Queue current pattern to first free slot
|
|
||||||
- **G**: Queue removal of current pattern from its slot
|
|
||||||
|
|
||||||
### Files
|
|
||||||
|
|
||||||
- **s**: Save project
|
|
||||||
- **l**: Load project
|
|
||||||
- **Ctrl+C**: Copy step script
|
|
||||||
- **Ctrl+V**: Paste step script
|
|
||||||
|
|
||||||
### Execution
|
|
||||||
|
|
||||||
- **Ctrl+R**: Run current step's script immediately (one-shot)
|
|
||||||
|
|
||||||
### Tempo
|
|
||||||
|
|
||||||
- **+ / =**: Increase tempo
|
|
||||||
- **-**: Decrease tempo
|
|
||||||
|
|
||||||
## Main Page - Editor Focus
|
|
||||||
|
|
||||||
- **Tab / Esc**: Return to sequencer focus
|
|
||||||
- **Ctrl+E**: Compile current step script
|
|
||||||
- **Ctrl+R**: Run script in editor immediately (one-shot)
|
|
||||||
|
|
||||||
## Audio Page
|
|
||||||
|
|
||||||
- **h**: Hush (stop all sounds gracefully)
|
|
||||||
- **p**: Panic (kill all sounds immediately)
|
|
||||||
- **r**: Reset peak voice counter
|
|
||||||
- **t**: Test sound (plays 440Hz sine)
|
|
||||||
- **Space**: Play/pause
|
|
||||||
|
|
||||||
## Doc Page
|
|
||||||
|
|
||||||
- **j / Down**: Next topic
|
|
||||||
- **k / Up**: Previous topic
|
|
||||||
- **PgDn**: Scroll content down
|
|
||||||
- **PgUp**: Scroll content up
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# Parameters
|
|
||||||
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
# Sequencer
|
|
||||||
|
|
||||||
## Structure
|
|
||||||
|
|
||||||
The sequencer is organized into:
|
|
||||||
|
|
||||||
- **Banks**: 16 banks (B01-B16)
|
|
||||||
- **Patterns**: 16 patterns per bank (P01-P16)
|
|
||||||
- **Steps**: Up to 32 steps per pattern
|
|
||||||
- **Slots**: 8 concurrent playback slots
|
|
||||||
|
|
||||||
## Patterns
|
|
||||||
|
|
||||||
Each pattern has:
|
|
||||||
|
|
||||||
- **Length**: Number of steps (1-32)
|
|
||||||
- **Speed**: Playback rate relative to tempo
|
|
||||||
- **Steps**: Each step can have a script
|
|
||||||
|
|
||||||
### Speed Settings
|
|
||||||
|
|
||||||
- 1/4: Quarter speed
|
|
||||||
- 1/2: Half speed
|
|
||||||
- 1x: Normal speed
|
|
||||||
- 2x: Double speed
|
|
||||||
- 4x: Quadruple speed
|
|
||||||
|
|
||||||
## Slots
|
|
||||||
|
|
||||||
Slots allow multiple patterns to play simultaneously.
|
|
||||||
|
|
||||||
- Press **1-8** to toggle a slot
|
|
||||||
- Slot changes are quantized to the next bar
|
|
||||||
- A "?" indicates a slot queued to start
|
|
||||||
- A "x" indicates a slot queued to stop
|
|
||||||
|
|
||||||
### Workflow
|
|
||||||
|
|
||||||
1. Edit a pattern in the main view
|
|
||||||
2. Press **g** to queue it to the first free slot
|
|
||||||
3. It starts playing at the next bar boundary
|
|
||||||
4. Press **G** to queue its removal
|
|
||||||
|
|
||||||
## Steps
|
|
||||||
|
|
||||||
Steps are the basic unit of the sequencer:
|
|
||||||
|
|
||||||
- Navigate with arrow keys
|
|
||||||
- Toggle active with Enter
|
|
||||||
- Each step can contain a Rhai script
|
|
||||||
|
|
||||||
### Active vs Inactive
|
|
||||||
|
|
||||||
- Active steps (highlighted) execute their script
|
|
||||||
- Inactive steps are skipped during playback
|
|
||||||
- Toggle with Enter key
|
|
||||||
|
|
||||||
## Playback
|
|
||||||
|
|
||||||
The sequencer uses Ableton Link for timing:
|
|
||||||
|
|
||||||
- Syncs with other Link-enabled apps
|
|
||||||
- Bar boundaries are used for slot changes
|
|
||||||
- Phase shows position within the current bar
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
Projects are saved as JSON files:
|
|
||||||
|
|
||||||
- **s**: Save with dialog
|
|
||||||
- **l**: Load with dialog
|
|
||||||
- File extension: `.buboseq`
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# Sound Basics
|
|
||||||
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# Tempo & Speed
|
|
||||||
|
|
||||||
@@ -59,17 +59,6 @@ const DOCS: &[DocEntry] = &[
|
|||||||
),
|
),
|
||||||
Topic("Space & Time", include_str!("../../docs/engine_space.md")),
|
Topic("Space & Time", include_str!("../../docs/engine_space.md")),
|
||||||
Topic("Words & Sounds", include_str!("../../docs/engine_words.md")),
|
Topic("Words & Sounds", include_str!("../../docs/engine_words.md")),
|
||||||
// Reference
|
|
||||||
Section("Reference"),
|
|
||||||
Topic("Audio Engine", include_str!("../../docs/audio_engine.md")),
|
|
||||||
Topic("Keybindings", include_str!("../../docs/keybindings.md")),
|
|
||||||
Topic("Sequencer", include_str!("../../docs/sequencer.md")),
|
|
||||||
// Archive - old files to sort
|
|
||||||
Section("Archive"),
|
|
||||||
Topic("Sound Basics", include_str!("../../docs/sound_basics.md")),
|
|
||||||
Topic("Parameters", include_str!("../../docs/parameters.md")),
|
|
||||||
Topic("Tempo & Speed", include_str!("../../docs/tempo.md")),
|
|
||||||
Topic("Effects (old)", include_str!("../../docs/effects.md")),
|
|
||||||
];
|
];
|
||||||
|
|
||||||
pub fn topic_count() -> usize {
|
pub fn topic_count() -> usize {
|
||||||
|
|||||||
Reference in New Issue
Block a user