8 Commits

Author SHA1 Message Date
25866f66d4 Feat: UI / UX improvements (top bar) 2026-03-07 19:31:31 +01:00
8b058f2bb9 Feat: CPU meter in top bar 2026-03-07 19:08:54 +01:00
cb82337d24 Feat: add missing LICENSE file 2026-03-07 15:32:23 +01:00
539aa6a9f7 Feat: move CI (GitHub - Gitea) 2026-03-07 14:23:28 +01:00
b7d9436cee Feat: move out of GitHub, remove GitHub references
All checks were successful
Deploy Website / deploy (push) Successful in 25s
2026-03-07 14:17:58 +01:00
3d345d57f5 Merge branch 'main' of https://git.raphaelforment.fr/BuboBubo/cagire
All checks were successful
Deploy Website / deploy (push) Successful in 25s
2026-03-07 14:15:21 +01:00
c6b14bf508 Feat: remove wix 2026-03-07 14:15:13 +01:00
Debian
5d755594cb Add Gitea Actions workflow for website deployment
Deploys the Astro website to the VPS nginx container via
the runner's mounted host volume on pushes to main.
2026-03-07 13:05:27 +00:00
27 changed files with 233 additions and 356 deletions

View File

@@ -81,7 +81,7 @@ jobs:
- name: Build .pkg installer - name: Build .pkg installer
run: | run: |
VERSION="${GITHUB_REF_NAME#v}" VERSION="${GITEA_REF_NAME#v}"
mkdir -p pkg-root/Applications pkg-root/usr/local/bin mkdir -p pkg-root/Applications pkg-root/usr/local/bin
cp -R Cagire.app pkg-root/Applications/ cp -R Cagire.app pkg-root/Applications/
cp cagire pkg-root/usr/local/bin/ cp cagire pkg-root/usr/local/bin/

View File

@@ -36,9 +36,7 @@ jobs:
- name: Prepare plugin artifacts - name: Prepare plugin artifacts
run: | run: |
mkdir -p target/bundled mkdir -p target/bundled
# CLAP: single .so renamed to .clap
cp target/aarch64-unknown-linux-gnu/release/libcagire_plugins.so target/bundled/cagire-plugins.clap cp target/aarch64-unknown-linux-gnu/release/libcagire_plugins.so target/bundled/cagire-plugins.clap
# VST3: correct directory structure
mkdir -p "target/bundled/cagire-plugins.vst3/Contents/aarch64-linux" mkdir -p "target/bundled/cagire-plugins.vst3/Contents/aarch64-linux"
cp target/aarch64-unknown-linux-gnu/release/libcagire_plugins.so "target/bundled/cagire-plugins.vst3/Contents/aarch64-linux/cagire-plugins.so" cp target/aarch64-unknown-linux-gnu/release/libcagire_plugins.so "target/bundled/cagire-plugins.vst3/Contents/aarch64-linux/cagire-plugins.so"

View File

@@ -0,0 +1,17 @@
name: Build Plugins
on:
workflow_dispatch:
jobs:
linux:
uses: ./.gitea/workflows/build-plugins-linux.yml
macos:
uses: ./.gitea/workflows/build-plugins-macos.yml
windows:
uses: ./.gitea/workflows/build-plugins-windows.yml
rpi:
uses: ./.gitea/workflows/build-plugins-rpi.yml

23
.gitea/workflows/ci.yml Normal file
View File

@@ -0,0 +1,23 @@
name: CI
on:
workflow_dispatch:
jobs:
linux:
uses: ./.gitea/workflows/build-linux.yml
with:
run-tests: true
run-clippy: true
macos:
uses: ./.gitea/workflows/build-macos.yml
with:
run-tests: true
run-clippy: true
windows:
uses: ./.gitea/workflows/build-windows.yml
with:
run-tests: true
run-clippy: true

View File

@@ -0,0 +1,38 @@
name: Deploy Website
on:
push:
branches: [main]
paths:
- 'website/**'
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
- name: Install dependencies
working-directory: website
run: pnpm install
- name: Build
working-directory: website
run: pnpm build
- name: Deploy to host volume
run: |
rm -rf /home/debian/my-services/cagire-website-data/*
cp -r website/dist/* /home/debian/my-services/cagire-website-data/

View File

@@ -2,23 +2,15 @@ name: Release
on: on:
workflow_dispatch: workflow_dispatch:
push:
tags: ['v*']
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs: jobs:
linux: linux:
if: github.server_url == 'https://github.com' uses: ./.gitea/workflows/build-linux.yml
uses: ./.github/workflows/build-linux.yml
with: with:
build-packages: true build-packages: true
macos: macos:
if: github.server_url == 'https://github.com' uses: ./.gitea/workflows/build-macos.yml
uses: ./.github/workflows/build-macos.yml
with: with:
build-packages: true build-packages: true
matrix: >- matrix: >-
@@ -28,26 +20,21 @@ jobs:
] ]
windows: windows:
if: github.server_url == 'https://github.com' uses: ./.gitea/workflows/build-windows.yml
uses: ./.github/workflows/build-windows.yml
with: with:
build-packages: true build-packages: true
cross: cross:
if: github.server_url == 'https://github.com' uses: ./.gitea/workflows/build-cross.yml
uses: ./.github/workflows/build-cross.yml
assemble-macos: assemble-macos:
needs: macos needs: macos
uses: ./.github/workflows/assemble-macos.yml uses: ./.gitea/workflows/assemble-macos.yml
release: release:
needs: [linux, macos, windows, cross, assemble-macos] needs: [linux, macos, windows, cross, assemble-macos]
if: startsWith(github.ref, 'refs/tags/v') && github.server_url == 'https://github.com'
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 10 timeout-minutes: 10
permissions:
contents: write
steps: steps:
- name: Download all artifacts - name: Download all artifacts
@@ -100,8 +87,25 @@ jobs:
fi fi
done done
- name: Create Release - name: Create Gitea release
uses: softprops/action-gh-release@v2 env:
with: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
files: release/* run: |
generate_release_notes: true TAG="${GITEA_REF_NAME:-manual-$(date +%Y%m%d-%H%M%S)}"
API_URL="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}/releases"
RELEASE_ID=$(curl -s -X POST "$API_URL" \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"tag_name\": \"$TAG\", \"name\": \"$TAG\", \"draft\": true}" \
| jq -r '.id')
for file in release/*; do
filename=$(basename "$file")
curl -s -X POST "$API_URL/$RELEASE_ID/assets?name=$filename" \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/octet-stream" \
--data-binary "@$file"
done
echo "Release $TAG created as draft with $(ls release | wc -l) assets"

View File

@@ -1,18 +0,0 @@
name: Build Plugins
on:
workflow_call:
workflow_dispatch:
jobs:
linux:
uses: ./.github/workflows/build-plugins-linux.yml
macos:
uses: ./.github/workflows/build-plugins-macos.yml
windows:
uses: ./.github/workflows/build-plugins-windows.yml
rpi:
uses: ./.github/workflows/build-plugins-rpi.yml

View File

@@ -1,28 +0,0 @@
name: CI
on:
push:
tags: ['v*']
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
linux:
uses: ./.github/workflows/build-linux.yml
with:
run-tests: true
run-clippy: true
macos:
uses: ./.github/workflows/build-macos.yml
with:
run-tests: true
run-clippy: true
windows:
uses: ./.github/workflows/build-windows.yml
with:
run-tests: true
run-clippy: true

View File

@@ -1,59 +0,0 @@
name: Deploy Website
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: pages
cancel-in-progress: true
jobs:
deploy:
if: github.server_url == 'https://github.com'
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
cache-dependency-path: website/pnpm-lock.yaml
- name: Install dependencies
run: pnpm install
working-directory: website
- name: Build
run: pnpm build
working-directory: website
- name: Setup Pages
uses: actions/configure-pages@v4
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: website/dist
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

View File

@@ -3,7 +3,7 @@
## Quick Start ## Quick Start
```bash ```bash
git clone https://github.com/Bubobubobubobubo/cagire git clone https://git.raphaelforment.fr/BuboBubo/cagire
cd cagire cd cagire
cargo build --release cargo build --release
``` ```

View File

@@ -6,7 +6,7 @@ version = "0.1.3"
edition = "2021" edition = "2021"
authors = ["Raphaël Forment <raphael.forment@gmail.com>"] authors = ["Raphaël Forment <raphael.forment@gmail.com>"]
license = "AGPL-3.0" license = "AGPL-3.0"
repository = "https://github.com/Bubobubobubobubo/cagire" repository = "https://git.raphaelforment.fr/BuboBubo/cagire"
homepage = "https://cagire.raphaelforment.fr" homepage = "https://cagire.raphaelforment.fr"
description = "Forth-based live coding music sequencer" description = "Forth-based live coding music sequencer"

View File

@@ -8,7 +8,7 @@
<p align="center"> <p align="center">
<a href="https://cagire.raphaelforment.fr">Website</a> &middot; <a href="https://cagire.raphaelforment.fr">Website</a> &middot;
<a href="https://github.com/Bubobubobubobubo/cagire">GitHub</a> &middot; <a href="https://git.raphaelforment.fr/BuboBubo/cagire">Gitea</a> &middot;
AGPL-3.0 AGPL-3.0
</p> </p>

View File

@@ -58,6 +58,7 @@ pub fn build(p: &Palette) -> ThemeColors {
header: HeaderColors { header: HeaderColors {
tempo_bg: rgb(tint(p.bg, p.tempo_color, 0.30)), tempo_bg: rgb(tint(p.bg, p.tempo_color, 0.30)),
tempo_fg: rgb(p.tempo_color), tempo_fg: rgb(p.tempo_color),
beat_bg: rgb(tint(p.bg, p.tempo_color, 0.45)),
bank_bg: rgb(tint(p.bg, p.bank_color, 0.25)), bank_bg: rgb(tint(p.bg, p.bank_color, 0.25)),
bank_fg: rgb(p.bank_color), bank_fg: rgb(p.bank_color),
pattern_bg: rgb(tint(p.bg, p.pattern_color, 0.25)), pattern_bg: rgb(tint(p.bg, p.pattern_color, 0.25)),

View File

@@ -175,6 +175,7 @@ pub struct TileColors {
pub struct HeaderColors { pub struct HeaderColors {
pub tempo_bg: Color, pub tempo_bg: Color,
pub tempo_fg: Color, pub tempo_fg: Color,
pub beat_bg: Color,
pub bank_bg: Color, pub bank_bg: Color,
pub bank_fg: Color, pub bank_fg: Color,
pub pattern_bg: Color, pub pattern_bg: Color,

View File

@@ -51,7 +51,7 @@ Section "Cagire (required)" SecCore
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cagire" "Publisher" "Raphael Forment" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cagire" "Publisher" "Raphael Forment"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cagire" "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cagire" "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cagire" "DisplayIcon" '"$INSTDIR\cagire-desktop.exe"' WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cagire" "DisplayIcon" '"$INSTDIR\cagire-desktop.exe"'
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cagire" "URLInfoAbout" "https://github.com/Bubobubobubobubo/cagire" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cagire" "URLInfoAbout" "https://git.raphaelforment.fr/BuboBubo/cagire"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cagire" "HelpLink" "https://cagire.raphaelforment.fr" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cagire" "HelpLink" "https://cagire.raphaelforment.fr"
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cagire" "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cagire" "NoModify" 1
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cagire" "NoRepair" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cagire" "NoRepair" 1

View File

@@ -0,0 +1,15 @@
ISC License
Copyright (c) Robbert van der Helm <mail@robbertvanderhelm.nl>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

View File

@@ -293,15 +293,14 @@ fn render_header(
let pad = Padding::vertical(1); let pad = Padding::vertical(1);
let [logo_area, transport_area, live_area, tempo_area, bank_area, pattern_area, stats_area] = let [logo_area, transport_area, tempo_area, bank_area, pattern_area, stats_area] =
Layout::horizontal([ Layout::horizontal([
Constraint::Length(5), Constraint::Length(5),
Constraint::Min(12), Constraint::Min(12),
Constraint::Length(9), Constraint::Min(20),
Constraint::Min(14),
Constraint::Fill(1), Constraint::Fill(1),
Constraint::Fill(2), Constraint::Fill(2),
Constraint::Min(20), Constraint::Min(24),
]) ])
.areas(area); .areas(area);
@@ -317,43 +316,76 @@ fn render_header(
logo_area, logo_area,
); );
// Transport block // Transport block (with fill indicator)
let (transport_bg, transport_text) = if app.playback.playing { let fill = app.live_keys.fill();
let (transport_bg, transport_label) = if app.playback.playing {
(theme.status.playing_bg, " ▶ PLAYING ") (theme.status.playing_bg, " ▶ PLAYING ")
} else { } else {
(theme.status.stopped_bg, " ■ STOPPED ") (theme.status.stopped_bg, " ■ STOPPED ")
}; };
let transport_style = Style::new().bg(transport_bg).fg(theme.ui.text_primary); let fill_span = if fill {
Span::styled("F", Style::new().fg(theme.status.fill_on).bg(transport_bg))
} else {
Span::styled(" ", Style::new().bg(transport_bg))
};
let transport_line = Line::from(vec![
Span::styled(transport_label, Style::new().fg(theme.ui.text_primary).bg(transport_bg)),
fill_span,
Span::styled(" ", Style::new().bg(transport_bg)),
]);
frame.render_widget( frame.render_widget(
Paragraph::new(transport_text) Paragraph::new(transport_line)
.block(Block::default().padding(pad).style(transport_style)) .block(Block::default().padding(pad).style(Style::new().bg(transport_bg)))
.alignment(Alignment::Center), .alignment(Alignment::Center),
transport_area, transport_area,
); );
// Fill indicator // Tempo + bar:beat position block (beat segments as background fills)
let fill = app.live_keys.fill(); let tempo_bg = theme.header.tempo_bg;
let fill_fg = if fill { let tempo_fg = theme.ui.text_primary;
theme.status.fill_on let quantum = link.quantum();
} else { let quantum_int = quantum.max(1.0) as usize;
theme.status.fill_off
}; // Base background
let fill_style = Style::new().bg(theme.status.fill_bg).fg(fill_fg);
frame.render_widget( frame.render_widget(
Paragraph::new(if fill { "F" } else { "·" }) Block::default().style(Style::new().bg(tempo_bg)),
.block(Block::default().padding(pad).style(fill_style)) tempo_area,
.alignment(Alignment::Center),
live_area,
); );
// Tempo block // Beat segment highlight (like CPU meter but divided into quantum segments)
let tempo_style = Style::new() if app.playback.playing && quantum_int <= 16 {
.bg(theme.header.tempo_bg) let phase = link.phase();
.fg(theme.ui.text_primary) let beat_in_bar = phase.floor() as usize;
.add_modifier(Modifier::BOLD); let seg_w = tempo_area.width / quantum_int as u16;
let seg_x = tempo_area.x + seg_w * beat_in_bar as u16;
let seg_width = if beat_in_bar == quantum_int - 1 {
tempo_area.width - seg_w * beat_in_bar as u16
} else {
seg_w
};
frame.render_widget(
Block::default().style(Style::new().bg(theme.header.beat_bg)),
Rect {
x: seg_x,
width: seg_width,
..tempo_area
},
);
}
// Text overlay
let tempo_text = if app.playback.playing {
let phase = link.phase();
let beat_in_bar = phase.floor() as usize + 1;
let bar = (link.beat() / quantum).floor() as usize + 1;
format!(" {:.1} BPM {bar}:{beat_in_bar} ", link.tempo())
} else {
format!(" {:.1} BPM ─:─ ", link.tempo())
};
frame.render_widget( frame.render_widget(
Paragraph::new(format!(" {:.1} BPM ", link.tempo())) Paragraph::new(tempo_text)
.block(Block::default().padding(pad).style(tempo_style)) .block(Block::default().padding(pad))
.style(Style::new().fg(tempo_fg).add_modifier(Modifier::BOLD))
.alignment(Alignment::Center), .alignment(Alignment::Center),
tempo_area, tempo_area,
); );
@@ -393,42 +425,61 @@ fn render_header(
.get_iter(app.editor_ctx.bank, app.editor_ctx.pattern) .get_iter(app.editor_ctx.bank, app.editor_ctx.pattern)
.map(|iter| format!(" · #{}", iter + 1)) .map(|iter| format!(" · #{}", iter + 1))
.unwrap_or_default(); .unwrap_or_default();
let pattern_text = format!( let pattern_bg = theme.header.pattern_bg;
" {} · {} steps{}{}{} ", let active_count = snapshot.active_patterns.len();
pattern_name, pattern.length, speed_info, page_info, iter_info let active_info = format!(" · ▶{active_count}");
); let active_style = if active_count > 0 {
let pattern_style = Style::new() Style::new().bg(pattern_bg).fg(theme.ui.text_primary)
.bg(theme.header.pattern_bg) } else {
.fg(theme.ui.text_primary); Style::new().bg(pattern_bg).fg(theme.ui.text_muted)
};
let pattern_line = Line::from(vec![
Span::styled(
format!(
" {} · {} steps{}{}{} ",
pattern_name, pattern.length, speed_info, page_info, iter_info
),
Style::new().bg(pattern_bg).fg(theme.ui.text_primary),
),
Span::styled(active_info, active_style),
]);
frame.render_widget( frame.render_widget(
Paragraph::new(pattern_text) Paragraph::new(pattern_line)
.block(Block::default().padding(pad).style(pattern_style)) .block(Block::default().padding(pad).style(Style::new().bg(pattern_bg)))
.alignment(Alignment::Center), .alignment(Alignment::Center),
pattern_area, pattern_area,
); );
// Stats block // Stats block — CPU bar filling the area, text overlaid
let cpu_pct = (app.metrics.cpu_load * 100.0).min(100.0); let cpu_pct = (app.metrics.cpu_load * 100.0).min(100.0);
let peers = link.peers();
let voices = app.metrics.active_voices; let voices = app.metrics.active_voices;
let cpu_color = if cpu_pct >= 80.0 { let cpu_bar_color = if cpu_pct >= 80.0 {
theme.flash.error_fg theme.flash.error_fg
} else if cpu_pct >= 50.0 { } else if cpu_pct >= 50.0 {
theme.ui.accent theme.ui.accent
} else { } else {
theme.header.stats_fg theme.meter.low
}; };
let dim = Style::new()
.bg(theme.header.stats_bg)
.fg(theme.header.stats_fg);
let stats_line = Line::from(vec![
Span::styled(format!(" CPU {cpu_pct:.0}%"), dim.fg(cpu_color)),
Span::styled(format!(" V:{voices} L:{peers} "), dim),
]);
let block_style = Style::new().bg(theme.header.stats_bg);
frame.render_widget( frame.render_widget(
Paragraph::new(stats_line) Block::default().style(Style::new().bg(theme.header.stats_bg)),
.block(Block::default().padding(pad).style(block_style)) stats_area,
);
let filled_w = (cpu_pct / 100.0 * stats_area.width as f32).round() as u16;
if filled_w > 0 {
frame.render_widget(
Block::default().style(Style::new().bg(cpu_bar_color)),
Rect {
width: filled_w.min(stats_area.width),
..stats_area
},
);
}
let stats_text = format!("CPU {cpu_pct:.0}% V:{voices}");
frame.render_widget(
Paragraph::new(stats_text)
.block(Block::default().padding(pad))
.style(Style::new().fg(theme.ui.text_primary))
.alignment(Alignment::Center), .alignment(Alignment::Center),
stats_area, stats_area,
); );

View File

@@ -87,11 +87,11 @@ const DL = 'https://dlcagire.raphaelforment.fr';
<tr> <tr>
<td>Windows (x86_64)</td> <td>Windows (x86_64)</td>
<td><a href={`${DL}/cagire-windows-x86_64.zip`}>zip</a></td> <td><a href={`${DL}/cagire-windows-x86_64.zip`}>zip</a></td>
<td><a href={`${DL}/cagire-desktop-windows-x86_64.zip`}>zip</a> · <s>.msi</s></td> <td><a href={`${DL}/cagire-windows-x86_64-desktop.zip`}>zip</a> · <a href={`${DL}/cagire-windows-x86_64-installer.zip`}>installer</a></td>
<td><a href={`${DL}/plugins-windows-x86_64-clap.zip`}>CLAP</a> · <a href={`${DL}/plugins-windows-x86_64-vst3.zip`}>VST3</a></td> <td><a href={`${DL}/cagire-windows-x86_64-clap.zip`}>CLAP</a> · <a href={`${DL}/cagire-windows-x86_64-vst3.zip`}>VST3</a></td>
</tr> </tr>
</table> </table>
<p class="note">Source code and issue tracker on <a href="https://github.com/Bubobubobubobubo/cagire">GitHub</a>. You can also compile the software yourself from source!</p> <p class="note">Source code and issue tracker on <a href="https://git.raphaelforment.fr/BuboBubo/cagire">Gitea</a>. You can also compile the software yourself from source!</p>
<h2>Documentation</h2> <h2>Documentation</h2>
@@ -128,7 +128,7 @@ const DL = 'https://dlcagire.raphaelforment.fr';
<video src="/mono_cagire.mp4" autoplay muted loop playsinline></video> <video src="/mono_cagire.mp4" autoplay muted loop playsinline></video>
<p class="colophon"> <p class="colophon">
<a href="https://raphaelforment.fr">BuboBubo</a> · Audio engine: <a href="https://doux.livecoding.fr">Doux</a> · <a href="https://github.com/Bubobubobubobubo/cagire">GitHub</a> · <a href="/docs">Docs</a> · AGPL-3.0 </p> <a href="https://raphaelforment.fr">BuboBubo</a> · Audio engine: <a href="https://doux.livecoding.fr">Doux</a> · <a href="https://git.raphaelforment.fr/BuboBubo/cagire">Gitea</a> · <a href="/docs">Docs</a> · AGPL-3.0 </p>
<script is:inline src="/script.js"></script> <script is:inline src="/script.js"></script>
</body> </body>

View File

@@ -1,20 +0,0 @@
{\rtf1\ansi\deff0\nouicompat{\fonttbl{\f0\fswiss\fcharset0 Helvetica;}}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1
\pard\sa200\sl276\slmult1\f0\fs20\lang9
CAGIRE - Forth-based Music Sequencer\par
Copyright (c) 2025 Rapha\"el Forment\par
\par
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.\par
\par
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.\par
\par
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see https://www.gnu.org/licenses/.\par
}

View File

@@ -1,146 +0,0 @@
<?xml version='1.0' encoding='windows-1252'?>
<?if $(sys.BUILDARCH) = x64 or $(sys.BUILDARCH) = intel64 ?>
<?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
<?else ?>
<?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
<?endif ?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
<Product
Id='*'
Name='Cagire'
UpgradeCode='F2A3D4E5-6B7C-8D9E-0F1A-2B3C4D5E6F7A'
Manufacturer='Raphael Forment'
Language='1033'
Codepage='1252'
Version='$(var.Version)'>
<Package Id='*'
Keywords='Installer'
Description='Cagire - Forth-based music sequencer'
Manufacturer='Raphael Forment'
InstallerVersion='450'
Languages='1033'
Compressed='yes'
InstallScope='perMachine'
SummaryCodepage='1252'
/>
<MajorUpgrade
Schedule='afterInstallInitialize'
DowngradeErrorMessage='A newer version of [ProductName] is already installed. Setup will now exit.'/>
<Media Id='1' Cabinet='media1.cab' EmbedCab='yes' DiskPrompt='CD-ROM #1'/>
<Property Id='DiskPrompt' Value='Cagire Installation'/>
<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id='$(var.PlatformProgramFilesFolder)' Name='PFiles'>
<Directory Id='APPLICATIONFOLDER' Name='Cagire'>
<Component Id='CagireCLI' Guid='A1B2C3D4-E5F6-7890-ABCD-EF1234567890' Win64='yes'>
<File
Id='CagireEXE'
Name='cagire.exe'
DiskId='1'
Source='$(var.CargoTargetBinDir)\cagire.exe'
KeyPath='yes'/>
</Component>
<Component Id='CagireDesktop' Guid='B2C3D4E5-F6A7-8901-BCDE-F12345678901' Win64='yes'>
<File
Id='CagireDesktopEXE'
Name='cagire-desktop.exe'
DiskId='1'
Source='$(var.CargoTargetBinDir)\cagire-desktop.exe'
KeyPath='yes'/>
</Component>
<Component Id='PathEntry' Guid='C3D4E5F6-A7B8-9012-CDEF-123456789012' Win64='yes' KeyPath='yes'>
<Environment
Id='PATH'
Name='PATH'
Value='[APPLICATIONFOLDER]'
Permanent='no'
Part='last'
Action='set'
System='yes'/>
</Component>
</Directory>
</Directory>
<Directory Id='ProgramMenuFolder'>
<Directory Id='ApplicationProgramsFolder' Name='Cagire'>
<Component Id='StartMenuShortcut' Guid='D4E5F6A7-B8C9-0123-DEFA-234567890123' Win64='yes'>
<Shortcut
Id='CagireDesktopShortcut'
Name='Cagire'
Description='Forth-based music sequencer'
Target='[APPLICATIONFOLDER]cagire-desktop.exe'
WorkingDirectory='APPLICATIONFOLDER'
Icon='CagireIcon.exe'/>
<RemoveFolder Id='CleanUpShortcutFolder' On='uninstall'/>
<RegistryValue
Root='HKCU'
Key='Software\Cagire'
Name='installed'
Type='integer'
Value='1'
KeyPath='yes'/>
</Component>
</Directory>
</Directory>
</Directory>
<Feature
Id='Binaries'
Title='Application'
Description='Installs Cagire CLI and Desktop binaries.'
Level='1'
ConfigurableDirectory='APPLICATIONFOLDER'
AllowAdvertise='no'
Display='expand'
Absent='disallow'>
<ComponentRef Id='CagireCLI'/>
<ComponentRef Id='CagireDesktop'/>
<Feature
Id='Environment'
Title='PATH Environment Variable'
Description='Add the install location to the PATH system environment variable. This allows the cagire CLI to be called from any location.'
Level='1'
Absent='allow'>
<ComponentRef Id='PathEntry'/>
</Feature>
</Feature>
<Feature
Id='StartMenu'
Title='Start Menu Shortcut'
Description='Add a Cagire shortcut to the Start Menu.'
Level='1'
Absent='allow'>
<ComponentRef Id='StartMenuShortcut'/>
</Feature>
<SetProperty Id='ARPINSTALLLOCATION' Value='[APPLICATIONFOLDER]' After='CostFinalize'/>
<Icon Id='CagireIcon.exe' SourceFile='assets\Cagire.ico'/>
<Property Id='ARPPRODUCTICON' Value='CagireIcon.exe'/>
<Property Id='ARPHELPLINK' Value='https://cagire.raphaelforment.fr'/>
<Property Id='ARPURLINFOABOUT' Value='https://github.com/Bubobubobubobubo/cagire'/>
<UI>
<UIRef Id='WixUI_FeatureTree'/>
<Publish Dialog='WelcomeDlg' Control='Next' Event='NewDialog' Value='CustomizeDlg' Order='99'>1</Publish>
<Publish Dialog='CustomizeDlg' Control='Back' Event='NewDialog' Value='WelcomeDlg' Order='99'>1</Publish>
</UI>
<WixVariable Id='WixUILicenseRtf' Value='wix\License.rtf'/>
</Product>
</Wix>