mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 06:44:57 +01:00
Merge 7d9c3822d3 into 0f3760a8d1
This commit is contained in:
commit
100c7eb204
6 changed files with 1672 additions and 0 deletions
21
.mcp.json
Normal file
21
.mcp.json
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"ardour": {
|
||||||
|
"type": "stdio",
|
||||||
|
"command": "uv",
|
||||||
|
"args": [
|
||||||
|
"--directory",
|
||||||
|
"/home/beengud/raibid-labs/ardour-mcp",
|
||||||
|
"run",
|
||||||
|
"ardour-mcp"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"midi-gen": {
|
||||||
|
"type": "stdio",
|
||||||
|
"command": "node",
|
||||||
|
"args": [
|
||||||
|
"/home/beengud/raibid-labs/ardour-mcp/mcp-servers/midi-mcp-server/build/index.js"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
290
CLAUDE.md
Normal file
290
CLAUDE.md
Normal file
|
|
@ -0,0 +1,290 @@
|
||||||
|
# CLAUDE.md
|
||||||
|
|
||||||
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||||
|
|
||||||
|
## Project Overview
|
||||||
|
|
||||||
|
Ardour is a professional digital audio workstation (DAW) for Linux, macOS, and Windows. It supports multi-track audio and MIDI recording, editing, mixing, and mastering with support for various plugin formats (LV2, VST2, VST3, AU).
|
||||||
|
|
||||||
|
Official website: https://ardour.org/
|
||||||
|
Development guide: https://ardour.org/development.html
|
||||||
|
|
||||||
|
## Build System
|
||||||
|
|
||||||
|
Ardour uses **Waf** (Python-based build system). All build commands use `python3 ./waf`.
|
||||||
|
|
||||||
|
### Essential Build Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Set PKG_CONFIG_PATH for Homebrew/custom library paths (if needed)
|
||||||
|
export PKG_CONFIG_PATH="/home/linuxbrew/.linuxbrew/lib/pkgconfig:/home/linuxbrew/.linuxbrew/share/pkgconfig:/usr/lib/pkgconfig"
|
||||||
|
|
||||||
|
# Configure the build
|
||||||
|
python3 ./waf configure
|
||||||
|
|
||||||
|
# Build with parallel jobs
|
||||||
|
python3 ./waf build -j4
|
||||||
|
|
||||||
|
# Install (optional)
|
||||||
|
python3 ./waf install
|
||||||
|
|
||||||
|
# Clean build
|
||||||
|
python3 ./waf clean
|
||||||
|
|
||||||
|
# Complete clean (removes configuration)
|
||||||
|
python3 ./waf distclean
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build Options
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Configure with optimizations
|
||||||
|
python3 ./waf configure --optimize
|
||||||
|
|
||||||
|
# Build with debugging symbols
|
||||||
|
python3 ./waf configure --debug-symbols
|
||||||
|
|
||||||
|
# Build with tests
|
||||||
|
python3 ./waf configure --test
|
||||||
|
|
||||||
|
# Run tests after build
|
||||||
|
python3 ./waf configure --run-tests
|
||||||
|
|
||||||
|
# Build specific backends (JACK, ALSA, PulseAudio, etc.)
|
||||||
|
python3 ./waf configure --with-backends=jack,alsa,dummy
|
||||||
|
|
||||||
|
# Build without VST support
|
||||||
|
python3 ./waf configure --no-lxvst --no-vst3
|
||||||
|
|
||||||
|
# Force C++17 mode
|
||||||
|
python3 ./waf configure --cxx17
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build Outputs
|
||||||
|
|
||||||
|
- Main executable: `build/gtk2_ardour/ardour-<VERSION>`
|
||||||
|
- Libraries: `build/libs/*/`
|
||||||
|
- Built-in LV2 plugins: `build/libs/plugins/*/`
|
||||||
|
|
||||||
|
### Running Tests
|
||||||
|
|
||||||
|
Individual library tests can be found in `libs/*/test/` directories:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build tests
|
||||||
|
python3 ./waf configure --test
|
||||||
|
python3 ./waf build
|
||||||
|
|
||||||
|
# Run evoral tests (example)
|
||||||
|
cd libs/evoral
|
||||||
|
./run-tests.sh
|
||||||
|
|
||||||
|
# Set up environment for test data
|
||||||
|
export EVORAL_TEST_PATH="libs/evoral/test/testdata"
|
||||||
|
export LD_LIBRARY_PATH="build/libs/evoral:build/libs/pbd:$LD_LIBRARY_PATH"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Architecture Overview
|
||||||
|
|
||||||
|
### Core Architecture Layers
|
||||||
|
|
||||||
|
Ardour is structured as a layered system with clear separation between the audio engine, session management, and UI:
|
||||||
|
|
||||||
|
1. **Audio Engine Layer** (`libs/ardour/`)
|
||||||
|
- Session management (libs/ardour/ardour/session.h)
|
||||||
|
- Audio/MIDI routing and processing
|
||||||
|
- Real-time audio graph execution
|
||||||
|
- Plugin hosting (LV2, VST2, VST3, AU)
|
||||||
|
- Export/import functionality
|
||||||
|
|
||||||
|
2. **Low-Level Libraries**
|
||||||
|
- `libs/pbd/` - Portable Build Dependencies (threading, signals, file utilities)
|
||||||
|
- `libs/temporal/` - Time and tempo handling (beats, bars, superclock)
|
||||||
|
- `libs/evoral/` - Event-based MIDI sequencing and control automation
|
||||||
|
- `libs/audiographer/` - Audio processing graph for export/analysis
|
||||||
|
|
||||||
|
3. **Backend Layer** (`libs/backends/`)
|
||||||
|
- Audio backend abstractions: JACK, ALSA, PulseAudio, CoreAudio, PortAudio, Dummy
|
||||||
|
- Each backend implements the `AudioBackend` interface
|
||||||
|
|
||||||
|
4. **UI Layer** (`gtk2_ardour/`)
|
||||||
|
- GTK2-based UI (despite the name, uses GTK3+ in modern versions)
|
||||||
|
- Canvas rendering system (`libs/canvas/`)
|
||||||
|
- Custom widgets (`libs/widgets/`, `libs/gtkmm2ext/`)
|
||||||
|
- Waveform rendering (`libs/waveview/`)
|
||||||
|
|
||||||
|
5. **Control Surfaces** (`libs/surfaces/`)
|
||||||
|
- Hardware controller support: Mackie Control, Faderport, Push2, OSC, etc.
|
||||||
|
- Generic MIDI control
|
||||||
|
- WebSocket interface for remote control
|
||||||
|
|
||||||
|
6. **Plugin System**
|
||||||
|
- Built-in plugins in `libs/plugins/` (a-comp, a-delay, a-eq, etc.)
|
||||||
|
- Plugin discovery and scanning (`libs/auscan/` for AU)
|
||||||
|
- VST support (`libs/fst/`, `libs/vst3/`)
|
||||||
|
|
||||||
|
### Key Concepts
|
||||||
|
|
||||||
|
- **Session**: The top-level container for a project. Manages routes, sources, regions, playlists, and the processing graph.
|
||||||
|
- **Route**: Abstract base for tracks and busses. Handles signal flow, processors, and automation.
|
||||||
|
- **Region**: A section of audio or MIDI data with position and length.
|
||||||
|
- **Processor**: Audio/MIDI processing element (plugins, sends, inserts).
|
||||||
|
- **Temporal**: Ardour uses multiple time domains (audio samples, musical beats, wall-clock time). The `libs/temporal/` library handles conversions.
|
||||||
|
|
||||||
|
### Signal Flow
|
||||||
|
|
||||||
|
```
|
||||||
|
AudioBackend → AudioEngine → Session → Routes → Processors → BufferSet
|
||||||
|
```
|
||||||
|
|
||||||
|
Audio flows through:
|
||||||
|
1. Backend captures audio from hardware
|
||||||
|
2. AudioEngine distributes to session
|
||||||
|
3. Session routes through the processing graph
|
||||||
|
4. Each Route processes through its processor chain
|
||||||
|
5. Output buffers are sent back to the backend
|
||||||
|
|
||||||
|
### Thread Model
|
||||||
|
|
||||||
|
- **Process thread**: Real-time audio processing (JACK process callback or equivalent)
|
||||||
|
- **Butler thread**: Disk I/O operations (reading/writing audio files)
|
||||||
|
- **GUI thread**: User interface updates (GTK main loop)
|
||||||
|
- **Background threads**: File scanning, analysis, exports
|
||||||
|
|
||||||
|
Communication between threads uses lock-free structures and message queues to maintain real-time safety.
|
||||||
|
|
||||||
|
## Lua Scripting
|
||||||
|
|
||||||
|
Ardour has extensive Lua scripting support for automation and extending functionality.
|
||||||
|
|
||||||
|
- Scripts location: `share/scripts/`
|
||||||
|
- Documentation: https://manual.ardour.org/lua-scripting/
|
||||||
|
- Interactive scripting console: Window > Scripting in the UI
|
||||||
|
|
||||||
|
Script naming conventions:
|
||||||
|
- `_*.lua` - Example scripts (not installed)
|
||||||
|
- `__*.lua` - Excluded from unit tests
|
||||||
|
- `s_*.lua` - Code snippets for interactive use
|
||||||
|
- `_-*.lua` - Ignored by git (local dev scripts)
|
||||||
|
|
||||||
|
## Development Environment
|
||||||
|
|
||||||
|
### Running from Build Directory
|
||||||
|
|
||||||
|
Use the `ardev` wrapper scripts to run Ardour from the build directory without installing:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Linux
|
||||||
|
./gtk2_ardour/ardev
|
||||||
|
|
||||||
|
# Set up environment variables manually (if needed)
|
||||||
|
source gtk2_ardour/ardev_common.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
The `ardev` script sets up:
|
||||||
|
- `ARDOUR_SURFACES_PATH` - Control surface modules
|
||||||
|
- `ARDOUR_BACKEND_PATH` - Audio backend modules
|
||||||
|
- `ARDOUR_DATA_PATH` - UI themes, icons, templates
|
||||||
|
- `ARDOUR_MIDI_PATCH_PATH` - MIDI instrument definitions
|
||||||
|
|
||||||
|
### Debugging
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build with debug symbols
|
||||||
|
python3 ./waf configure --debug-symbols
|
||||||
|
|
||||||
|
# Run with gdb
|
||||||
|
gdb --args ./build/gtk2_ardour/ardour-<VERSION>
|
||||||
|
|
||||||
|
# Enable Ardour debug flags (set before running)
|
||||||
|
export ARDOUR_DEBUG="all" # or specific flags like "AudioEngine,Processor"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Session Utilities
|
||||||
|
|
||||||
|
Command-line tools for batch processing sessions (in `session_utils/`):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Example utilities
|
||||||
|
./build/session_utils/new_session # Create new session from command line
|
||||||
|
./build/session_utils/copy-mixer # Copy mixer settings
|
||||||
|
./build/session_utils/export # Batch export
|
||||||
|
```
|
||||||
|
|
||||||
|
## Important Files and Directories
|
||||||
|
|
||||||
|
- `wscript` - Main build configuration
|
||||||
|
- `libs/ardour/` - Core audio engine
|
||||||
|
- `gtk2_ardour/` - Main UI implementation
|
||||||
|
- `libs/backends/` - Audio backend implementations
|
||||||
|
- `libs/surfaces/` - Control surface support
|
||||||
|
- `libs/plugins/` - Built-in audio plugins (LV2 format)
|
||||||
|
- `share/` - Runtime data (templates, scripts, themes)
|
||||||
|
- `tools/` - Development and packaging utilities
|
||||||
|
|
||||||
|
## Coding Patterns
|
||||||
|
|
||||||
|
### Memory Management
|
||||||
|
|
||||||
|
- Modern C++ with extensive use of `std::shared_ptr` and smart pointers
|
||||||
|
- RCU (Read-Copy-Update) pattern for lock-free data structures (`pbd/rcu.h`)
|
||||||
|
- Real-time safe allocators for audio thread (`pbd/reallocpool.h` or `pbd/tlsf.h`)
|
||||||
|
|
||||||
|
### Signal/Slot System
|
||||||
|
|
||||||
|
Uses `pbd/signals.h` (not Boost.Signals) for decoupled communication between components.
|
||||||
|
|
||||||
|
### State Management
|
||||||
|
|
||||||
|
Most objects inherit from `PBD::Stateful` for serialization to XML. Session state is saved in `.ardour` XML files.
|
||||||
|
|
||||||
|
## Common Development Workflows
|
||||||
|
|
||||||
|
### Adding a New Built-in Plugin
|
||||||
|
|
||||||
|
1. Create plugin directory in `libs/plugins/`
|
||||||
|
2. Implement LV2 plugin interface
|
||||||
|
3. Add to `libs/plugins/wscript`
|
||||||
|
4. Rebuild: `python3 ./waf build`
|
||||||
|
|
||||||
|
### Modifying the UI
|
||||||
|
|
||||||
|
1. UI code is in `gtk2_ardour/`
|
||||||
|
2. Canvas rendering uses `libs/canvas/`
|
||||||
|
3. Custom widgets in `libs/widgets/`
|
||||||
|
4. Themes are in `gtk2_ardour/themes/`
|
||||||
|
|
||||||
|
### Working with Sessions
|
||||||
|
|
||||||
|
1. Session code in `libs/ardour/session*.cc`
|
||||||
|
2. Session state format defined by XML serialization
|
||||||
|
3. Use `session_utils/` tools for batch operations
|
||||||
|
|
||||||
|
## Platform-Specific Notes
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
- Primary development platform
|
||||||
|
- Requires JACK, ALSA, or PulseAudio
|
||||||
|
- Package dependencies: see https://ardour.org/development.html
|
||||||
|
|
||||||
|
### macOS
|
||||||
|
- Requires macOS 10.13+
|
||||||
|
- Uses CoreAudio backend
|
||||||
|
- AU (Audio Units) plugin support
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
- MinGW cross-compilation or MSVC
|
||||||
|
- ASIO support via PortAudio backend
|
||||||
|
|
||||||
|
## Git Workflow
|
||||||
|
|
||||||
|
- Main branch: `master`
|
||||||
|
- Requires full git clone (uses `git describe` for versioning)
|
||||||
|
- GitHub release tarballs are NOT supported - clone the repository
|
||||||
|
|
||||||
|
## Important Notes
|
||||||
|
|
||||||
|
- Ardour version is maintained via git tags
|
||||||
|
- The build depends on `git describe` output for version information
|
||||||
|
- Pre-commit hooks may modify files (auto-formatting, version updates)
|
||||||
|
- When committing, always check for hook-modified files before finalizing
|
||||||
175
doc/OSC-MCP-README.md
Normal file
175
doc/OSC-MCP-README.md
Normal file
|
|
@ -0,0 +1,175 @@
|
||||||
|
# Ardour OSC & MCP Quick Start
|
||||||
|
|
||||||
|
This directory contains documentation for using Ardour with OSC (Open Sound Control) and MCP (Model Context Protocol) for AI-assisted audio production.
|
||||||
|
|
||||||
|
## What's This About?
|
||||||
|
|
||||||
|
The ardour-mcp project enables AI assistants (like Claude) to control Ardour through OSC, creating powerful AI-assisted workflows for audio production, mixing, and automation.
|
||||||
|
|
||||||
|
## Quick Start (5 Minutes)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Build Ardour with OSC support
|
||||||
|
just setup-mcp
|
||||||
|
|
||||||
|
# 2. Run Ardour with OSC debugging
|
||||||
|
just run-osc-debug
|
||||||
|
|
||||||
|
# 3. In Ardour: Edit > Preferences > Control Surfaces
|
||||||
|
# - Enable "Open Sound Control (OSC)"
|
||||||
|
# - Set port to 3819
|
||||||
|
|
||||||
|
# 4. Test the connection
|
||||||
|
just test-osc-connection
|
||||||
|
|
||||||
|
# 5. Set up and run ardour-mcp server (in sibling directory)
|
||||||
|
cd ../ardour-mcp
|
||||||
|
# (follow ardour-mcp setup instructions)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
- **[ardour-mcp-integration.md](./ardour-mcp-integration.md)** - Complete integration guide
|
||||||
|
- What is MCP and why use it with Ardour
|
||||||
|
- Full setup instructions
|
||||||
|
- Architecture overview
|
||||||
|
- Troubleshooting guide
|
||||||
|
|
||||||
|
- **[osc-examples.md](./osc-examples.md)** - Practical OSC examples
|
||||||
|
- Quick configuration guide
|
||||||
|
- OSC command reference
|
||||||
|
- Python, Node.js, and shell script examples
|
||||||
|
- Testing and monitoring tools
|
||||||
|
|
||||||
|
## Common Commands (Using Just)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Get help
|
||||||
|
just help
|
||||||
|
|
||||||
|
# Development workflow
|
||||||
|
just dev # Configure, build, run (debug mode)
|
||||||
|
just osc-dev # Build with OSC + run with OSC debug
|
||||||
|
|
||||||
|
# Information
|
||||||
|
just osc-info # Show OSC configuration info
|
||||||
|
just mcp-info # Show MCP integration info
|
||||||
|
|
||||||
|
# Building
|
||||||
|
just configure-osc # Configure with OSC support
|
||||||
|
just build # Build with parallel jobs
|
||||||
|
just rebuild # Clean and rebuild
|
||||||
|
|
||||||
|
# Running
|
||||||
|
just run # Run from build directory
|
||||||
|
just run-osc-debug # Run with OSC debugging
|
||||||
|
just run-debug-all # Run with all debug output
|
||||||
|
|
||||||
|
# Testing
|
||||||
|
just check-osc # Verify OSC library was built
|
||||||
|
just test-osc-connection # Test if OSC port is responding
|
||||||
|
just watch-logs # Monitor Ardour logs in real-time
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- **AI-Assisted Mixing**: Get intelligent suggestions for EQ, compression, and mix balance
|
||||||
|
- **Automation**: Automate repetitive tasks through natural language commands
|
||||||
|
- **Session Analysis**: AI analysis of your session structure and routing
|
||||||
|
- **Learning**: Interactive guidance for learning Ardour features
|
||||||
|
- **Scripting**: Generate Lua scripts for custom automation
|
||||||
|
|
||||||
|
## Example Interactions with Claude
|
||||||
|
|
||||||
|
Once set up, you can interact with Ardour through Claude:
|
||||||
|
|
||||||
|
```
|
||||||
|
You: "Show me all the tracks in my current session"
|
||||||
|
Claude: [Uses MCP to query Ardour via OSC]
|
||||||
|
"Your session has 12 tracks: Kick, Snare, Toms, OH-L, OH-R,
|
||||||
|
Bass, Guitar-L, Guitar-R, Keys, Vocal-Lead, Vocal-BG, Master"
|
||||||
|
|
||||||
|
You: "Mute all the drum tracks"
|
||||||
|
Claude: [Sends OSC commands to mute tracks 1-6]
|
||||||
|
"Muted 6 drum tracks"
|
||||||
|
|
||||||
|
You: "Set up a parallel compression bus for the drums"
|
||||||
|
Claude: [Creates aux track, configures routing, suggests plugin settings]
|
||||||
|
"Created 'Drums Parallel' bus with routing from tracks 1-6..."
|
||||||
|
```
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
Claude Code/AI Assistant
|
||||||
|
↕ MCP Protocol
|
||||||
|
ardour-mcp Server
|
||||||
|
↕ OSC Protocol (UDP Port 3819)
|
||||||
|
Ardour DAW
|
||||||
|
```
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Ardour 8.x+ (built from source)
|
||||||
|
- Python 3.8+ or Node.js 14+ (for ardour-mcp)
|
||||||
|
- Just command runner (optional but recommended)
|
||||||
|
- ardour-mcp server (sibling project)
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### OSC Not Working
|
||||||
|
```bash
|
||||||
|
# Check if OSC is enabled
|
||||||
|
just osc-info
|
||||||
|
|
||||||
|
# Verify OSC library exists
|
||||||
|
just check-osc
|
||||||
|
|
||||||
|
# Test connection
|
||||||
|
just test-osc-connection
|
||||||
|
|
||||||
|
# Run with debug output
|
||||||
|
just run-osc-debug
|
||||||
|
```
|
||||||
|
|
||||||
|
### Need More Help?
|
||||||
|
|
||||||
|
1. Check the detailed guides linked above
|
||||||
|
2. Look at [osc-examples.md](./osc-examples.md) for working code
|
||||||
|
3. Watch logs: `just watch-logs`
|
||||||
|
4. Ask in Ardour forums: https://discourse.ardour.org/
|
||||||
|
|
||||||
|
## Security Note
|
||||||
|
|
||||||
|
OSC has no authentication. Keep port 3819 accessible only from localhost (127.0.0.1). Never expose it to untrusted networks.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Found a useful workflow? Share it!
|
||||||
|
- Add examples to osc-examples.md
|
||||||
|
- Contribute to ardour-mcp documentation
|
||||||
|
- Share templates and scripts
|
||||||
|
- Report issues and improvements
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
- [Ardour Manual - OSC](https://manual.ardour.org/using-control-surfaces/controlling-ardour-with-osc/)
|
||||||
|
- [OSC Protocol Specification](https://opensoundcontrol.stanford.edu/)
|
||||||
|
- [Model Context Protocol](https://modelcontextprotocol.io/)
|
||||||
|
- [Ardour Development](https://ardour.org/development.html)
|
||||||
|
|
||||||
|
## Quick Reference Card
|
||||||
|
|
||||||
|
| Task | Command |
|
||||||
|
|------|---------|
|
||||||
|
| Complete setup | `just setup-mcp` |
|
||||||
|
| Build & run with OSC | `just osc-dev` |
|
||||||
|
| Test OSC | `just test-osc-connection` |
|
||||||
|
| Show OSC info | `just osc-info` |
|
||||||
|
| Show MCP info | `just mcp-info` |
|
||||||
|
| Watch logs | `just watch-logs` |
|
||||||
|
| Help | `just help` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Ready to start?** Run `just setup-mcp` and follow the prompts!
|
||||||
446
doc/ardour-mcp-integration.md
Normal file
446
doc/ardour-mcp-integration.md
Normal file
|
|
@ -0,0 +1,446 @@
|
||||||
|
# Ardour-MCP Integration Guide
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The **ardour-mcp** project provides a Model Context Protocol (MCP) server that enables AI assistants (such as Claude) to control and interact with Ardour through its Open Sound Control (OSC) interface. This creates a powerful workflow where AI can help with audio production tasks, automation, mixing, and session management.
|
||||||
|
|
||||||
|
## What is MCP?
|
||||||
|
|
||||||
|
Model Context Protocol (MCP) is an open protocol that allows AI assistants to safely interact with external systems through well-defined interfaces. The ardour-mcp server acts as a bridge between Claude (or other MCP-compatible AI assistants) and Ardour's OSC control surface.
|
||||||
|
|
||||||
|
## Why Use Ardour with MCP?
|
||||||
|
|
||||||
|
### Benefits
|
||||||
|
|
||||||
|
1. **AI-Assisted Mixing**: Get AI help with EQ suggestions, compression settings, and mix balance
|
||||||
|
2. **Automated Workflows**: Automate repetitive tasks like track setup, routing, and plugin configuration
|
||||||
|
3. **Natural Language Control**: Control Ardour using conversational commands instead of clicking through menus
|
||||||
|
4. **Session Analysis**: Get insights about your session structure, track counts, routing complexity
|
||||||
|
5. **Learning Assistant**: Learn Ardour features through interactive guidance
|
||||||
|
6. **Scripting Help**: Generate Lua scripts for custom automation
|
||||||
|
7. **Documentation Access**: Quick access to Ardour documentation and best practices
|
||||||
|
|
||||||
|
### Use Cases
|
||||||
|
|
||||||
|
- **Quick Mix Setup**: "Set up a standard rock band mix with drums, bass, guitars, and vocals"
|
||||||
|
- **Automation Tasks**: "Create a volume fade out on the master bus from bar 64 to bar 68"
|
||||||
|
- **Plugin Management**: "Add a compressor to all drum tracks with conservative settings"
|
||||||
|
- **Session Organization**: "Show me all tracks that have no input connections"
|
||||||
|
- **Problem Solving**: "Why am I getting feedback in my monitoring setup?"
|
||||||
|
- **Export Automation**: "Export all tracks as individual stems with specific naming"
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────┐
|
||||||
|
│ Claude Code / │
|
||||||
|
│ AI Assistant │
|
||||||
|
└────────┬────────┘
|
||||||
|
│ MCP Protocol
|
||||||
|
│
|
||||||
|
┌────────▼────────┐
|
||||||
|
│ ardour-mcp │
|
||||||
|
│ MCP Server │
|
||||||
|
└────────┬────────┘
|
||||||
|
│ OSC Protocol (UDP)
|
||||||
|
│ Port 3819
|
||||||
|
┌────────▼────────┐
|
||||||
|
│ Ardour │
|
||||||
|
│ OSC Surface │
|
||||||
|
└─────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
### System Requirements
|
||||||
|
|
||||||
|
- Ardour 8.x or later (built from source recommended for development)
|
||||||
|
- Python 3.8+ (for ardour-mcp server)
|
||||||
|
- Network connectivity (localhost for typical setup)
|
||||||
|
- Just command runner (optional, but recommended)
|
||||||
|
|
||||||
|
### Installing Dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install just (command runner)
|
||||||
|
curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash
|
||||||
|
|
||||||
|
# Or via package manager
|
||||||
|
# Ubuntu/Debian: cargo install just
|
||||||
|
# macOS: brew install just
|
||||||
|
# Arch: pacman -S just
|
||||||
|
```
|
||||||
|
|
||||||
|
## Setup Instructions
|
||||||
|
|
||||||
|
### Step 1: Build Ardour with OSC Support
|
||||||
|
|
||||||
|
Ardour's OSC support is typically enabled by default, but you can explicitly configure it:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Navigate to Ardour source directory
|
||||||
|
cd /path/to/ardour
|
||||||
|
|
||||||
|
# Configure with OSC support
|
||||||
|
just configure-osc
|
||||||
|
|
||||||
|
# Build Ardour
|
||||||
|
just build
|
||||||
|
|
||||||
|
# Verify OSC library was built
|
||||||
|
just check-osc
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Enable OSC in Ardour
|
||||||
|
|
||||||
|
1. **Start Ardour**:
|
||||||
|
```bash
|
||||||
|
just run-osc-debug
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Enable OSC Control Surface**:
|
||||||
|
- Go to `Edit > Preferences > Control Surfaces`
|
||||||
|
- Check the box next to `Open Sound Control (OSC)`
|
||||||
|
- Click `Show Protocol Settings`
|
||||||
|
|
||||||
|
3. **Configure OSC Settings**:
|
||||||
|
- **Port**: 3819 (default, recommended)
|
||||||
|
- **Protocol**: UDP
|
||||||
|
- **Reply Mode**: Enable if you want feedback from Ardour
|
||||||
|
- **Bank Size**: Set according to your needs (typically 0 for unlimited)
|
||||||
|
|
||||||
|
4. **Advanced Settings** (optional):
|
||||||
|
- **Debug Mode**: Enable for troubleshooting
|
||||||
|
- **Default Strip Types**: Configure which track types to expose
|
||||||
|
- **Feedback**: Configure which parameters send updates
|
||||||
|
|
||||||
|
5. **Click OK** to save settings
|
||||||
|
|
||||||
|
### Step 3: Set Up ardour-mcp Server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Navigate to ardour-mcp directory (sibling to ardour)
|
||||||
|
cd /path/to/ardour-mcp
|
||||||
|
|
||||||
|
# Install dependencies (if using Python)
|
||||||
|
pip install -r requirements.txt
|
||||||
|
|
||||||
|
# Or if using Node.js
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# Configure MCP server (check ardour-mcp documentation)
|
||||||
|
# Typically involves setting OSC host and port
|
||||||
|
|
||||||
|
# Start the MCP server
|
||||||
|
# (refer to ardour-mcp specific instructions)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Connect Claude Code to MCP
|
||||||
|
|
||||||
|
1. **Configure MCP in Claude Code**:
|
||||||
|
- Create or edit `~/.config/claude-code/mcp_settings.json`
|
||||||
|
- Add ardour-mcp server configuration
|
||||||
|
|
||||||
|
2. **Example MCP Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"ardour": {
|
||||||
|
"command": "python",
|
||||||
|
"args": ["/path/to/ardour-mcp/server.py"],
|
||||||
|
"env": {
|
||||||
|
"ARDOUR_OSC_HOST": "127.0.0.1",
|
||||||
|
"ARDOUR_OSC_PORT": "3819"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Restart Claude Code** to load the MCP server
|
||||||
|
|
||||||
|
### Step 5: Test the Connection
|
||||||
|
|
||||||
|
1. **Verify OSC Port**:
|
||||||
|
```bash
|
||||||
|
just test-osc-connection
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Test from Claude**:
|
||||||
|
- Open Claude Code
|
||||||
|
- Try a simple command: "What tracks are in my current Ardour session?"
|
||||||
|
- Claude should use the MCP server to query Ardour via OSC
|
||||||
|
|
||||||
|
## OSC Protocol Reference
|
||||||
|
|
||||||
|
### Common OSC Messages
|
||||||
|
|
||||||
|
Ardour's OSC implementation supports hundreds of commands. Here are some commonly used ones:
|
||||||
|
|
||||||
|
#### Transport Control
|
||||||
|
```
|
||||||
|
/transport_play - Start playback
|
||||||
|
/transport_stop - Stop playback
|
||||||
|
/rewind - Rewind to start
|
||||||
|
/ffwd - Fast forward to end
|
||||||
|
/goto_start - Jump to session start
|
||||||
|
/goto_end - Jump to session end
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Track/Strip Control
|
||||||
|
```
|
||||||
|
/strip/gain <ssid> <value> - Set track gain
|
||||||
|
/strip/pan_stereo_position <ssid> <pos> - Set pan position
|
||||||
|
/strip/mute <ssid> <0|1> - Mute/unmute track
|
||||||
|
/strip/solo <ssid> <0|1> - Solo/unsolo track
|
||||||
|
/strip/recenable <ssid> <0|1> - Enable/disable recording
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Session Information
|
||||||
|
```
|
||||||
|
/session/list - List all tracks
|
||||||
|
/strip/list - Get strip list with details
|
||||||
|
/session/frame_rate - Get sample rate
|
||||||
|
/session/timecode - Get current timecode
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Plugin Control
|
||||||
|
```
|
||||||
|
/strip/plugin/parameter <ssid> <plugin> <param> <value>
|
||||||
|
```
|
||||||
|
|
||||||
|
### OSC Query and Feedback
|
||||||
|
|
||||||
|
Ardour can send feedback about parameter changes:
|
||||||
|
|
||||||
|
```
|
||||||
|
/strip/gains - Subscribe to gain changes for all strips
|
||||||
|
/strip/fader/<ssid> - Feedback when fader moves
|
||||||
|
```
|
||||||
|
|
||||||
|
## Development Workflow
|
||||||
|
|
||||||
|
### Quick Start Development Cycle
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Terminal 1: Build and run Ardour with OSC debugging
|
||||||
|
cd /path/to/ardour
|
||||||
|
just osc-dev
|
||||||
|
|
||||||
|
# Terminal 2: Run ardour-mcp server
|
||||||
|
cd /path/to/ardour-mcp
|
||||||
|
# (start your MCP server)
|
||||||
|
|
||||||
|
# Terminal 3: Use Claude Code
|
||||||
|
claude-code
|
||||||
|
```
|
||||||
|
|
||||||
|
### Monitoring OSC Traffic
|
||||||
|
|
||||||
|
1. **Enable OSC Debug in Ardour**:
|
||||||
|
```bash
|
||||||
|
ARDOUR_DEBUG=OSC just run
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Watch Ardour Logs**:
|
||||||
|
```bash
|
||||||
|
just watch-logs
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Use OSC Monitor Tools**:
|
||||||
|
- `oscdump` - Command-line OSC monitor
|
||||||
|
- `OSCulator` (macOS) - GUI OSC monitor and router
|
||||||
|
- `protokol` - Cross-platform OSC/MIDI monitor
|
||||||
|
|
||||||
|
### Testing OSC Commands Manually
|
||||||
|
|
||||||
|
You can test OSC commands using various tools:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Using oscsend (from liblo-tools)
|
||||||
|
oscsend localhost 3819 /transport_play
|
||||||
|
|
||||||
|
# Using Python with python-osc
|
||||||
|
python3 << EOF
|
||||||
|
from pythonosc import udp_client
|
||||||
|
client = udp_client.SimpleUDPClient("127.0.0.1", 3819)
|
||||||
|
client.send_message("/transport_play", [])
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### OSC Not Responding
|
||||||
|
|
||||||
|
1. **Check OSC is enabled**:
|
||||||
|
- Edit > Preferences > Control Surfaces
|
||||||
|
- Verify "Open Sound Control (OSC)" is checked
|
||||||
|
|
||||||
|
2. **Verify port is not in use**:
|
||||||
|
```bash
|
||||||
|
netstat -an | grep 3819
|
||||||
|
# or
|
||||||
|
lsof -i :3819
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Check firewall settings**:
|
||||||
|
```bash
|
||||||
|
# Allow UDP port 3819 on localhost
|
||||||
|
sudo ufw allow 3819/udp
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Test with debug output**:
|
||||||
|
```bash
|
||||||
|
ARDOUR_DEBUG=OSC just run
|
||||||
|
```
|
||||||
|
|
||||||
|
### MCP Server Connection Issues
|
||||||
|
|
||||||
|
1. **Verify MCP server is running**:
|
||||||
|
```bash
|
||||||
|
ps aux | grep ardour-mcp
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Check MCP server logs** (location depends on ardour-mcp implementation)
|
||||||
|
|
||||||
|
3. **Verify Claude Code MCP configuration**:
|
||||||
|
```bash
|
||||||
|
cat ~/.config/claude-code/mcp_settings.json
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Test MCP server independently** (without Claude)
|
||||||
|
|
||||||
|
### Performance Issues
|
||||||
|
|
||||||
|
1. **Reduce OSC feedback**:
|
||||||
|
- Disable unnecessary feedback in OSC settings
|
||||||
|
- Use targeted queries instead of broad subscriptions
|
||||||
|
|
||||||
|
2. **Adjust OSC update rates** in Ardour preferences
|
||||||
|
|
||||||
|
3. **Use local connections only** (127.0.0.1, not 0.0.0.0)
|
||||||
|
|
||||||
|
## Security Considerations
|
||||||
|
|
||||||
|
### Network Exposure
|
||||||
|
|
||||||
|
- **Default configuration**: OSC listens on localhost only (127.0.0.1)
|
||||||
|
- **Remote access**: Be cautious enabling remote OSC access
|
||||||
|
- **Firewall**: Keep port 3819 blocked from external networks
|
||||||
|
- **No authentication**: OSC has no built-in authentication
|
||||||
|
|
||||||
|
### Best Practices
|
||||||
|
|
||||||
|
1. **Never expose OSC to untrusted networks**
|
||||||
|
2. **Use SSH tunneling** for remote access if needed
|
||||||
|
3. **Run ardour-mcp and Ardour on the same machine**
|
||||||
|
4. **Keep ardour-mcp updated** for security patches
|
||||||
|
5. **Monitor OSC traffic** in production environments
|
||||||
|
|
||||||
|
## Advanced Topics
|
||||||
|
|
||||||
|
### Custom OSC Scripts
|
||||||
|
|
||||||
|
You can create custom OSC interaction scripts:
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Example: Automated mixing script
|
||||||
|
from pythonosc import udp_client
|
||||||
|
|
||||||
|
client = udp_client.SimpleUDPClient("127.0.0.1", 3819)
|
||||||
|
|
||||||
|
# Set consistent levels for drum bus
|
||||||
|
drum_tracks = [1, 2, 3, 4] # Kick, snare, toms, OH
|
||||||
|
for track in drum_tracks:
|
||||||
|
client.send_message(f"/strip/gain", [track, -6.0])
|
||||||
|
client.send_message(f"/strip/solo", [track, 0])
|
||||||
|
```
|
||||||
|
|
||||||
|
### Integrating with Lua Scripts
|
||||||
|
|
||||||
|
Ardour's Lua scripting can complement OSC control:
|
||||||
|
|
||||||
|
- Use OSC for external control and monitoring
|
||||||
|
- Use Lua for complex internal automation
|
||||||
|
- Combine both for powerful workflows
|
||||||
|
|
||||||
|
### Multiple OSC Clients
|
||||||
|
|
||||||
|
Ardour can handle multiple OSC clients simultaneously:
|
||||||
|
|
||||||
|
- Different control surfaces
|
||||||
|
- Monitoring tools
|
||||||
|
- Multiple MCP servers
|
||||||
|
- Mix and match control paradigms
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
- [Ardour OSC Manual](https://manual.ardour.org/using-control-surfaces/controlling-ardour-with-osc/)
|
||||||
|
- [OSC Protocol Specification](https://opensoundcontrol.stanford.edu/)
|
||||||
|
- [Ardour Development Guide](https://ardour.org/development.html)
|
||||||
|
|
||||||
|
### Community
|
||||||
|
|
||||||
|
- Ardour Forums: https://discourse.ardour.org/
|
||||||
|
- Ardour IRC: #ardour on libera.chat
|
||||||
|
- GitHub Issues: https://github.com/Ardour/ardour
|
||||||
|
|
||||||
|
### Example Projects
|
||||||
|
|
||||||
|
- TouchOSC templates for Ardour
|
||||||
|
- Open Stage Control layouts
|
||||||
|
- Ardour OSC Python examples in `share/scripts/`
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
If you develop useful MCP tools or workflows:
|
||||||
|
|
||||||
|
1. Share your OSC command patterns
|
||||||
|
2. Contribute to ardour-mcp documentation
|
||||||
|
3. Create example sessions/templates
|
||||||
|
4. Write tutorials and blog posts
|
||||||
|
5. Report bugs and enhancement requests
|
||||||
|
|
||||||
|
## Appendix: Complete Setup Checklist
|
||||||
|
|
||||||
|
- [ ] Ardour built from source with OSC support
|
||||||
|
- [ ] Just command runner installed
|
||||||
|
- [ ] Ardour running: `just run-osc-debug`
|
||||||
|
- [ ] OSC enabled in Ardour preferences
|
||||||
|
- [ ] OSC port 3819 confirmed open: `just test-osc-connection`
|
||||||
|
- [ ] ardour-mcp server installed and configured
|
||||||
|
- [ ] ardour-mcp server running
|
||||||
|
- [ ] Claude Code MCP settings configured
|
||||||
|
- [ ] Test connection from Claude successful
|
||||||
|
- [ ] OSC debug output visible in Ardour logs
|
||||||
|
- [ ] Ready to use AI-assisted audio production!
|
||||||
|
|
||||||
|
## Quick Reference
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Complete setup in one command
|
||||||
|
just setup-mcp
|
||||||
|
|
||||||
|
# Get OSC information
|
||||||
|
just osc-info
|
||||||
|
|
||||||
|
# Get MCP integration information
|
||||||
|
just mcp-info
|
||||||
|
|
||||||
|
# Run Ardour with OSC debugging
|
||||||
|
just run-osc-debug
|
||||||
|
|
||||||
|
# Test OSC connection
|
||||||
|
just test-osc-connection
|
||||||
|
|
||||||
|
# Watch Ardour logs
|
||||||
|
just watch-logs
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Last Updated**: 2025-11-06
|
||||||
|
**Ardour Version**: 8.x
|
||||||
|
**OSC Protocol Version**: 1.0
|
||||||
541
doc/osc-examples.md
Normal file
541
doc/osc-examples.md
Normal file
|
|
@ -0,0 +1,541 @@
|
||||||
|
# Ardour OSC Configuration Examples
|
||||||
|
|
||||||
|
This document provides practical examples for configuring and using Ardour's Open Sound Control (OSC) interface.
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
### Enabling OSC in Ardour
|
||||||
|
|
||||||
|
1. Launch Ardour: `just run-osc-debug`
|
||||||
|
2. Navigate to: `Edit > Preferences > Control Surfaces`
|
||||||
|
3. Enable: `Open Sound Control (OSC)`
|
||||||
|
4. Click: `Show Protocol Settings`
|
||||||
|
|
||||||
|
### Recommended OSC Settings
|
||||||
|
|
||||||
|
```
|
||||||
|
Port: 3819
|
||||||
|
Reply Port: Auto (or specify if needed)
|
||||||
|
Bank Size: 0 (unlimited)
|
||||||
|
Strip Types: All enabled
|
||||||
|
Feedback: Enable for interactive control
|
||||||
|
Gainmode: dB
|
||||||
|
Default Strip: Audio Tracks
|
||||||
|
Debug Mode: Enable during development
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing OSC Connection
|
||||||
|
|
||||||
|
### Method 1: Using Command Line Tools
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Test if port is listening
|
||||||
|
just test-osc-connection
|
||||||
|
|
||||||
|
# Or manually with netcat
|
||||||
|
nc -zv -u 127.0.0.1 3819
|
||||||
|
```
|
||||||
|
|
||||||
|
### Method 2: Send Test OSC Message
|
||||||
|
|
||||||
|
Install `liblo-tools`:
|
||||||
|
```bash
|
||||||
|
# Ubuntu/Debian
|
||||||
|
sudo apt-get install liblo-tools
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
brew install liblo
|
||||||
|
```
|
||||||
|
|
||||||
|
Send a test command:
|
||||||
|
```bash
|
||||||
|
# Start playback
|
||||||
|
oscsend localhost 3819 /transport_play
|
||||||
|
|
||||||
|
# Stop playback
|
||||||
|
oscsend localhost 3819 /transport_stop
|
||||||
|
|
||||||
|
# Get session info
|
||||||
|
oscsend localhost 3819 /strip/list
|
||||||
|
```
|
||||||
|
|
||||||
|
### Method 3: Python Script
|
||||||
|
|
||||||
|
```python
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# test_osc.py - Test Ardour OSC connection
|
||||||
|
|
||||||
|
from pythonosc import udp_client
|
||||||
|
import time
|
||||||
|
|
||||||
|
# Create OSC client
|
||||||
|
client = udp_client.SimpleUDPClient("127.0.0.1", 3819)
|
||||||
|
|
||||||
|
print("Testing Ardour OSC connection...")
|
||||||
|
|
||||||
|
# Test transport controls
|
||||||
|
print("Starting playback...")
|
||||||
|
client.send_message("/transport_play", [])
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
print("Stopping playback...")
|
||||||
|
client.send_message("/transport_stop", [])
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
print("Rewinding to start...")
|
||||||
|
client.send_message("/goto_start", [])
|
||||||
|
|
||||||
|
print("Test complete!")
|
||||||
|
```
|
||||||
|
|
||||||
|
Install dependencies:
|
||||||
|
```bash
|
||||||
|
pip install python-osc
|
||||||
|
```
|
||||||
|
|
||||||
|
Run:
|
||||||
|
```bash
|
||||||
|
python3 test_osc.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Common OSC Commands
|
||||||
|
|
||||||
|
### Transport Control
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start/Stop
|
||||||
|
oscsend localhost 3819 /transport_play
|
||||||
|
oscsend localhost 3819 /transport_stop
|
||||||
|
|
||||||
|
# Recording
|
||||||
|
oscsend localhost 3819 /rec_enable_toggle
|
||||||
|
oscsend localhost 3819 /rec_enable i 1 # Enable recording
|
||||||
|
oscsend localhost 3819 /rec_enable i 0 # Disable recording
|
||||||
|
|
||||||
|
# Navigation
|
||||||
|
oscsend localhost 3819 /goto_start
|
||||||
|
oscsend localhost 3819 /goto_end
|
||||||
|
oscsend localhost 3819 /rewind
|
||||||
|
oscsend localhost 3819 /ffwd
|
||||||
|
|
||||||
|
# Loop
|
||||||
|
oscsend localhost 3819 /loop_toggle
|
||||||
|
oscsend localhost 3819 /set_loop_range # Set loop to current selection
|
||||||
|
```
|
||||||
|
|
||||||
|
### Track/Strip Control
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Gain control (ssid = strip ID, starts at 1)
|
||||||
|
oscsend localhost 3819 /strip/gain if 1 0.5 # Set track 1 gain to 50%
|
||||||
|
oscsend localhost 3819 /strip/gain if 1 1.0 # Set track 1 gain to 100%
|
||||||
|
oscsend localhost 3819 /strip/gain if 1 0.0 # Set track 1 gain to 0%
|
||||||
|
|
||||||
|
# Fader control (in dB)
|
||||||
|
oscsend localhost 3819 /strip/fader if 1 0.0 # Set track 1 to 0dB
|
||||||
|
oscsend localhost 3819 /strip/fader if 1 -6.0 # Set track 1 to -6dB
|
||||||
|
oscsend localhost 3819 /strip/fader if 1 -inf # Set track 1 to -infinity
|
||||||
|
|
||||||
|
# Pan control (-1.0 = full left, 0.0 = center, 1.0 = full right)
|
||||||
|
oscsend localhost 3819 /strip/pan_stereo_position if 1 0.0 # Center
|
||||||
|
oscsend localhost 3819 /strip/pan_stereo_position if 1 -1.0 # Full left
|
||||||
|
oscsend localhost 3819 /strip/pan_stereo_position if 1 1.0 # Full right
|
||||||
|
|
||||||
|
# Mute/Solo
|
||||||
|
oscsend localhost 3819 /strip/mute if 1 1 # Mute track 1
|
||||||
|
oscsend localhost 3819 /strip/mute if 1 0 # Unmute track 1
|
||||||
|
oscsend localhost 3819 /strip/solo if 1 1 # Solo track 1
|
||||||
|
oscsend localhost 3819 /strip/solo if 1 0 # Unsolo track 1
|
||||||
|
|
||||||
|
# Record enable
|
||||||
|
oscsend localhost 3819 /strip/recenable if 1 1 # Enable recording on track 1
|
||||||
|
oscsend localhost 3819 /strip/recenable if 1 0 # Disable recording on track 1
|
||||||
|
|
||||||
|
# Monitor
|
||||||
|
oscsend localhost 3819 /strip/monitor_input if 1 1
|
||||||
|
oscsend localhost 3819 /strip/monitor_disk if 1 1
|
||||||
|
```
|
||||||
|
|
||||||
|
### Session Information
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Get track list
|
||||||
|
oscsend localhost 3819 /strip/list
|
||||||
|
|
||||||
|
# Get track name
|
||||||
|
oscsend localhost 3819 /strip/name if 1
|
||||||
|
|
||||||
|
# Get session frame rate
|
||||||
|
oscsend localhost 3819 /session/frame_rate
|
||||||
|
|
||||||
|
# Get current time
|
||||||
|
oscsend localhost 3819 /session/timecode
|
||||||
|
```
|
||||||
|
|
||||||
|
### Master Bus Control
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Master gain
|
||||||
|
oscsend localhost 3819 /master/gain f 1.0
|
||||||
|
|
||||||
|
# Master mute
|
||||||
|
oscsend localhost 3819 /master/mute i 1
|
||||||
|
|
||||||
|
# Master fader (dB)
|
||||||
|
oscsend localhost 3819 /master/fader f 0.0
|
||||||
|
```
|
||||||
|
|
||||||
|
## Python Examples
|
||||||
|
|
||||||
|
### Complete Control Script
|
||||||
|
|
||||||
|
```python
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# ardour_control.py - Comprehensive Ardour control example
|
||||||
|
|
||||||
|
from pythonosc import udp_client
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
|
||||||
|
class ArdourOSC:
|
||||||
|
def __init__(self, host="127.0.0.1", port=3819):
|
||||||
|
self.client = udp_client.SimpleUDPClient(host, port)
|
||||||
|
|
||||||
|
def transport_play(self):
|
||||||
|
"""Start playback"""
|
||||||
|
self.client.send_message("/transport_play", [])
|
||||||
|
|
||||||
|
def transport_stop(self):
|
||||||
|
"""Stop playback"""
|
||||||
|
self.client.send_message("/transport_stop", [])
|
||||||
|
|
||||||
|
def goto_start(self):
|
||||||
|
"""Jump to session start"""
|
||||||
|
self.client.send_message("/goto_start", [])
|
||||||
|
|
||||||
|
def set_track_gain(self, track_id, gain):
|
||||||
|
"""Set track gain (0.0 to 1.0)"""
|
||||||
|
self.client.send_message("/strip/gain", [track_id, gain])
|
||||||
|
|
||||||
|
def set_track_fader(self, track_id, db):
|
||||||
|
"""Set track fader in dB"""
|
||||||
|
self.client.send_message("/strip/fader", [track_id, db])
|
||||||
|
|
||||||
|
def mute_track(self, track_id, mute=True):
|
||||||
|
"""Mute or unmute a track"""
|
||||||
|
self.client.send_message("/strip/mute", [track_id, 1 if mute else 0])
|
||||||
|
|
||||||
|
def solo_track(self, track_id, solo=True):
|
||||||
|
"""Solo or unsolo a track"""
|
||||||
|
self.client.send_message("/strip/solo", [track_id, 1 if solo else 0])
|
||||||
|
|
||||||
|
def set_pan(self, track_id, position):
|
||||||
|
"""Set pan position (-1.0 to 1.0)"""
|
||||||
|
self.client.send_message("/strip/pan_stereo_position", [track_id, position])
|
||||||
|
|
||||||
|
def rec_enable_track(self, track_id, enable=True):
|
||||||
|
"""Enable/disable recording on a track"""
|
||||||
|
self.client.send_message("/strip/recenable", [track_id, 1 if enable else 0])
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Create controller
|
||||||
|
ardour = ArdourOSC()
|
||||||
|
|
||||||
|
print("Ardour OSC Control Demo")
|
||||||
|
print("-" * 40)
|
||||||
|
|
||||||
|
# Example workflow
|
||||||
|
print("1. Going to start...")
|
||||||
|
ardour.goto_start()
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
print("2. Setting up track 1...")
|
||||||
|
ardour.set_track_fader(1, -6.0) # Set to -6dB
|
||||||
|
ardour.set_pan(1, 0.0) # Center pan
|
||||||
|
ardour.mute_track(1, False) # Ensure unmuted
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
print("3. Starting playback...")
|
||||||
|
ardour.transport_play()
|
||||||
|
time.sleep(5)
|
||||||
|
|
||||||
|
print("4. Stopping playback...")
|
||||||
|
ardour.transport_stop()
|
||||||
|
|
||||||
|
print("\nDemo complete!")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Batch Track Setup
|
||||||
|
|
||||||
|
```python
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# setup_mix.py - Batch configure multiple tracks
|
||||||
|
|
||||||
|
from pythonosc import udp_client
|
||||||
|
|
||||||
|
def setup_standard_mix():
|
||||||
|
"""Set up a standard rock band mix"""
|
||||||
|
client = udp_client.SimpleUDPClient("127.0.0.1", 3819)
|
||||||
|
|
||||||
|
# Define mix template
|
||||||
|
# Format: (track_id, gain_db, pan, name)
|
||||||
|
mix_template = [
|
||||||
|
(1, -6.0, 0.0, "Kick"), # Center, moderate level
|
||||||
|
(2, -8.0, 0.0, "Snare"), # Center, slightly lower
|
||||||
|
(3, -10.0, -0.3, "Tom 1"), # Left of center
|
||||||
|
(4, -10.0, 0.3, "Tom 2"), # Right of center
|
||||||
|
(5, -6.0, -0.8, "OH Left"), # Hard left
|
||||||
|
(6, -6.0, 0.8, "OH Right"), # Hard right
|
||||||
|
(7, -4.0, 0.0, "Bass"), # Center, loud
|
||||||
|
(8, -6.0, -0.5, "Guitar L"), # Left
|
||||||
|
(9, -6.0, 0.5, "Guitar R"), # Right
|
||||||
|
(10, -3.0, 0.0, "Vocal"), # Center, loudest
|
||||||
|
]
|
||||||
|
|
||||||
|
print("Setting up standard rock mix...")
|
||||||
|
for track_id, gain_db, pan, name in mix_template:
|
||||||
|
print(f" Configuring {name} (Track {track_id})")
|
||||||
|
client.send_message("/strip/fader", [track_id, gain_db])
|
||||||
|
client.send_message("/strip/pan_stereo_position", [track_id, pan])
|
||||||
|
|
||||||
|
print("Mix setup complete!")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
setup_standard_mix()
|
||||||
|
```
|
||||||
|
|
||||||
|
### OSC Monitor
|
||||||
|
|
||||||
|
```python
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# osc_monitor.py - Monitor OSC messages from Ardour
|
||||||
|
|
||||||
|
from pythonosc import dispatcher
|
||||||
|
from pythonosc import osc_server
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
def print_handler(unused_addr, *args):
|
||||||
|
"""Print all received OSC messages"""
|
||||||
|
print(f"[OSC] {unused_addr}: {args}")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("--ip", default="127.0.0.1", help="Listen IP")
|
||||||
|
parser.add_argument("--port", type=int, default=3820, help="Listen port")
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# Set up dispatcher to catch all messages
|
||||||
|
disp = dispatcher.Dispatcher()
|
||||||
|
disp.set_default_handler(print_handler)
|
||||||
|
|
||||||
|
# Create server
|
||||||
|
server = osc_server.ThreadingOSCUDPServer((args.ip, args.port), disp)
|
||||||
|
|
||||||
|
print(f"OSC Monitor listening on {args.ip}:{args.port}")
|
||||||
|
print("Configure Ardour to send feedback to this port")
|
||||||
|
print("Press Ctrl+C to exit\n")
|
||||||
|
|
||||||
|
try:
|
||||||
|
server.serve_forever()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("\nShutting down...")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
```
|
||||||
|
|
||||||
|
## Node.js Examples
|
||||||
|
|
||||||
|
### Basic OSC Client
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// ardour-osc.js - Node.js OSC client for Ardour
|
||||||
|
|
||||||
|
const osc = require('node-osc');
|
||||||
|
|
||||||
|
class ArdourOSC {
|
||||||
|
constructor(host = '127.0.0.1', port = 3819) {
|
||||||
|
this.client = new osc.Client(host, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
send(address, ...args) {
|
||||||
|
this.client.send(address, ...args);
|
||||||
|
}
|
||||||
|
|
||||||
|
play() {
|
||||||
|
this.send('/transport_play');
|
||||||
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
this.send('/transport_stop');
|
||||||
|
}
|
||||||
|
|
||||||
|
setTrackGain(trackId, gain) {
|
||||||
|
this.send('/strip/gain', trackId, gain);
|
||||||
|
}
|
||||||
|
|
||||||
|
setTrackFader(trackId, db) {
|
||||||
|
this.send('/strip/fader', trackId, db);
|
||||||
|
}
|
||||||
|
|
||||||
|
muteTrack(trackId, mute = true) {
|
||||||
|
this.send('/strip/mute', trackId, mute ? 1 : 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Example usage
|
||||||
|
const ardour = new ArdourOSC();
|
||||||
|
|
||||||
|
console.log('Testing Ardour connection...');
|
||||||
|
ardour.play();
|
||||||
|
setTimeout(() => ardour.stop(), 3000);
|
||||||
|
```
|
||||||
|
|
||||||
|
Install dependencies:
|
||||||
|
```bash
|
||||||
|
npm install node-osc
|
||||||
|
```
|
||||||
|
|
||||||
|
## Shell Script Examples
|
||||||
|
|
||||||
|
### Quick Control Script
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# ardour-ctl.sh - Shell script for Ardour control
|
||||||
|
|
||||||
|
OSC_HOST="localhost"
|
||||||
|
OSC_PORT="3819"
|
||||||
|
|
||||||
|
osc_send() {
|
||||||
|
oscsend "$OSC_HOST" "$OSC_PORT" "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
play)
|
||||||
|
echo "Starting playback..."
|
||||||
|
osc_send /transport_play
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
echo "Stopping playback..."
|
||||||
|
osc_send /transport_stop
|
||||||
|
;;
|
||||||
|
start)
|
||||||
|
echo "Jumping to start..."
|
||||||
|
osc_send /goto_start
|
||||||
|
;;
|
||||||
|
mute)
|
||||||
|
if [ -z "$2" ]; then
|
||||||
|
echo "Usage: $0 mute <track_id>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Muting track $2..."
|
||||||
|
osc_send /strip/mute if "$2" 1
|
||||||
|
;;
|
||||||
|
unmute)
|
||||||
|
if [ -z "$2" ]; then
|
||||||
|
echo "Usage: $0 unmute <track_id>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Unmuting track $2..."
|
||||||
|
osc_send /strip/mute if "$2" 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 {play|stop|start|mute|unmute} [args]"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
```
|
||||||
|
|
||||||
|
Make executable:
|
||||||
|
```bash
|
||||||
|
chmod +x ardour-ctl.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
```bash
|
||||||
|
./ardour-ctl.sh play
|
||||||
|
./ardour-ctl.sh mute 1
|
||||||
|
./ardour-ctl.sh stop
|
||||||
|
```
|
||||||
|
|
||||||
|
## OSC Message Reference
|
||||||
|
|
||||||
|
### Path Format
|
||||||
|
|
||||||
|
```
|
||||||
|
/strip/<command> [ssid] [arguments]
|
||||||
|
```
|
||||||
|
|
||||||
|
Where:
|
||||||
|
- `ssid` = Strip/track ID (starts at 1)
|
||||||
|
- Arguments vary by command
|
||||||
|
|
||||||
|
### Complete Command List
|
||||||
|
|
||||||
|
See the [Ardour OSC documentation](https://manual.ardour.org/using-control-surfaces/controlling-ardour-with-osc/osc-control/) for the complete list of supported messages.
|
||||||
|
|
||||||
|
Common patterns:
|
||||||
|
```
|
||||||
|
/strip/[parameter] if [ssid] [value]
|
||||||
|
/[global_command]
|
||||||
|
/master/[parameter] [value]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### No Response from Ardour
|
||||||
|
|
||||||
|
1. Verify OSC is enabled in preferences
|
||||||
|
2. Check port number (default: 3819)
|
||||||
|
3. Ensure Ardour is running
|
||||||
|
4. Test with debug output: `ARDOUR_DEBUG=OSC just run`
|
||||||
|
|
||||||
|
### Messages Not Received
|
||||||
|
|
||||||
|
1. Check firewall settings
|
||||||
|
2. Verify correct IP address (use 127.0.0.1 for local)
|
||||||
|
3. Ensure UDP protocol (not TCP)
|
||||||
|
4. Test with `oscdump` to monitor traffic
|
||||||
|
|
||||||
|
### Permission Issues
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check port permissions
|
||||||
|
sudo lsof -i :3819
|
||||||
|
|
||||||
|
# Allow local OSC traffic
|
||||||
|
sudo ufw allow from 127.0.0.1 to any port 3819
|
||||||
|
```
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Always use localhost (127.0.0.1)** for development
|
||||||
|
2. **Add error handling** in scripts
|
||||||
|
3. **Add delays** between rapid commands (10-50ms)
|
||||||
|
4. **Test commands individually** before batch operations
|
||||||
|
5. **Enable debug mode** during development
|
||||||
|
6. **Document your OSC workflows** for team members
|
||||||
|
7. **Use strip names** instead of IDs when possible (via feedback)
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
1. Read the complete guide: `doc/ardour-mcp-integration.md`
|
||||||
|
2. Set up ardour-mcp server
|
||||||
|
3. Try the examples above
|
||||||
|
4. Create your own control scripts
|
||||||
|
5. Share your workflows with the community
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
- OSC Specification: http://opensoundcontrol.org/
|
||||||
|
- python-osc: https://pypi.org/project/python-osc/
|
||||||
|
- node-osc: https://www.npmjs.com/package/node-osc
|
||||||
|
- Ardour Manual: https://manual.ardour.org/
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Last Updated**: 2025-11-06
|
||||||
199
justfile
Normal file
199
justfile
Normal file
|
|
@ -0,0 +1,199 @@
|
||||||
|
# Ardour Build and Development Helper
|
||||||
|
# Uses just (https://github.com/casey/just)
|
||||||
|
|
||||||
|
# Default recipe - show available commands
|
||||||
|
default:
|
||||||
|
@just --list
|
||||||
|
|
||||||
|
# Configure build with default options
|
||||||
|
configure:
|
||||||
|
python3 ./waf configure
|
||||||
|
|
||||||
|
# Configure with debugging symbols (useful for development)
|
||||||
|
configure-debug:
|
||||||
|
python3 ./waf configure --debug-symbols
|
||||||
|
|
||||||
|
# Configure with optimizations (for production builds)
|
||||||
|
configure-optimized:
|
||||||
|
python3 ./waf configure --optimize
|
||||||
|
|
||||||
|
# Configure with tests enabled
|
||||||
|
configure-test:
|
||||||
|
python3 ./waf configure --test --run-tests
|
||||||
|
|
||||||
|
# Configure with OSC surface support explicitly enabled
|
||||||
|
configure-osc:
|
||||||
|
python3 ./waf configure --surfaces
|
||||||
|
|
||||||
|
# Build Ardour (parallel build with 4 jobs)
|
||||||
|
build jobs="4":
|
||||||
|
python3 ./waf build -j{{jobs}}
|
||||||
|
|
||||||
|
# Build and show verbose output
|
||||||
|
build-verbose:
|
||||||
|
python3 ./waf build -v
|
||||||
|
|
||||||
|
# Clean build artifacts (keeps configuration)
|
||||||
|
clean:
|
||||||
|
python3 ./waf clean
|
||||||
|
|
||||||
|
# Complete clean (removes configuration too)
|
||||||
|
distclean:
|
||||||
|
python3 ./waf distclean
|
||||||
|
|
||||||
|
# Install Ardour to system
|
||||||
|
install:
|
||||||
|
python3 ./waf install
|
||||||
|
|
||||||
|
# Run Ardour from build directory (development mode)
|
||||||
|
run:
|
||||||
|
./gtk2_ardour/ardev
|
||||||
|
|
||||||
|
# Run Ardour with OSC debug output enabled
|
||||||
|
run-osc-debug:
|
||||||
|
ARDOUR_DEBUG=OSC ./gtk2_ardour/ardev
|
||||||
|
|
||||||
|
# Run Ardour with all debug output enabled
|
||||||
|
run-debug-all:
|
||||||
|
ARDOUR_DEBUG=all ./gtk2_ardour/ardev
|
||||||
|
|
||||||
|
# Run Ardour with specific debug flags (e.g., just --set debug="AudioEngine,Processor")
|
||||||
|
run-debug debug="OSC":
|
||||||
|
ARDOUR_DEBUG={{debug}} ./gtk2_ardour/ardev
|
||||||
|
|
||||||
|
# Full rebuild (clean, configure, build)
|
||||||
|
rebuild: clean configure build
|
||||||
|
|
||||||
|
# Full fresh build (distclean, configure, build)
|
||||||
|
fresh: distclean configure build
|
||||||
|
|
||||||
|
# Quick build workflow for development
|
||||||
|
dev: configure-debug build run
|
||||||
|
|
||||||
|
# Build with OSC support and run with OSC debugging
|
||||||
|
osc-dev: configure-osc build run-osc-debug
|
||||||
|
|
||||||
|
# Run tests (requires configure-test first)
|
||||||
|
test:
|
||||||
|
cd libs/evoral && ./run-tests.sh
|
||||||
|
|
||||||
|
# Setup test environment variables
|
||||||
|
test-env:
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
export EVORAL_TEST_PATH="libs/evoral/test/testdata"
|
||||||
|
export LD_LIBRARY_PATH="build/libs/evoral:build/libs/pbd:$LD_LIBRARY_PATH"
|
||||||
|
echo "Test environment configured"
|
||||||
|
|
||||||
|
# Check OSC surface library was built
|
||||||
|
check-osc:
|
||||||
|
@ls -lh build/libs/surfaces/osc/osc.so 2>/dev/null || echo "OSC surface not built. Run: just configure-osc build"
|
||||||
|
|
||||||
|
# Display OSC configuration info
|
||||||
|
osc-info:
|
||||||
|
@echo "OSC Surface Information:"
|
||||||
|
@echo "------------------------"
|
||||||
|
@echo "Default OSC Port: 3819"
|
||||||
|
@echo "Protocol: UDP"
|
||||||
|
@echo "Documentation: https://manual.ardour.org/using-control-surfaces/controlling-ardour-with-osc/"
|
||||||
|
@echo ""
|
||||||
|
@echo "To enable OSC in Ardour:"
|
||||||
|
@echo "1. Start Ardour: just run"
|
||||||
|
@echo "2. Go to: Edit > Preferences > Control Surfaces"
|
||||||
|
@echo "3. Enable 'Open Sound Control (OSC)'"
|
||||||
|
@echo "4. Click 'Show Protocol Settings' to configure port and options"
|
||||||
|
@echo ""
|
||||||
|
@echo "For ardour-mcp integration, see: doc/ardour-mcp-integration.md"
|
||||||
|
|
||||||
|
# Show MCP integration information
|
||||||
|
mcp-info:
|
||||||
|
@echo "Ardour-MCP Integration:"
|
||||||
|
@echo "----------------------"
|
||||||
|
@echo "The ardour-mcp project provides a Model Context Protocol server"
|
||||||
|
@echo "that allows AI assistants (like Claude) to control Ardour via OSC."
|
||||||
|
@echo ""
|
||||||
|
@echo "Setup steps:"
|
||||||
|
@echo "1. Build and run Ardour: just osc-dev"
|
||||||
|
@echo "2. Enable OSC in Ardour (port 3819)"
|
||||||
|
@echo "3. Run ardour-mcp server in the sibling directory"
|
||||||
|
@echo "4. Connect Claude Code to the MCP server"
|
||||||
|
@echo ""
|
||||||
|
@echo "See doc/ardour-mcp-integration.md for detailed instructions"
|
||||||
|
|
||||||
|
# Test OSC connection (requires netcat)
|
||||||
|
test-osc-connection port="3819":
|
||||||
|
@echo "Testing OSC connection on port {{port}}..."
|
||||||
|
@nc -zv -u 127.0.0.1 {{port}} 2>&1 || echo "Port {{port}} not responding. Is Ardour running with OSC enabled?"
|
||||||
|
|
||||||
|
# Show build info
|
||||||
|
info:
|
||||||
|
@echo "Ardour Build Information:"
|
||||||
|
@echo "------------------------"
|
||||||
|
@python3 ./waf --version
|
||||||
|
@echo ""
|
||||||
|
@git describe --tags --always 2>/dev/null || echo "Version: unknown (not a git repo)"
|
||||||
|
@echo ""
|
||||||
|
@echo "Build directory: $(pwd)/build"
|
||||||
|
@echo "Main executable: build/gtk2_ardour/ardour-*"
|
||||||
|
|
||||||
|
# Show current build configuration
|
||||||
|
config-info:
|
||||||
|
@cat build/c4che/_cache.py 2>/dev/null | grep -E "(PREFIX|ARDOUR|SURFACES)" || echo "Not configured. Run: just configure"
|
||||||
|
|
||||||
|
# Create OSC configuration template
|
||||||
|
create-osc-config:
|
||||||
|
@mkdir -p ~/.config/ardour8
|
||||||
|
@echo "Creating OSC configuration template..."
|
||||||
|
@echo "Manual configuration required in Ardour UI"
|
||||||
|
@echo "Config location: ~/.config/ardour8/"
|
||||||
|
|
||||||
|
# Show log files location
|
||||||
|
logs:
|
||||||
|
@echo "Ardour log files are typically in:"
|
||||||
|
@echo "~/.config/ardour8/ardour.log"
|
||||||
|
@ls -lh ~/.config/ardour*/ardour.log 2>/dev/null || echo "No logs found yet"
|
||||||
|
|
||||||
|
# Watch Ardour logs in real-time
|
||||||
|
watch-logs:
|
||||||
|
tail -f ~/.config/ardour*/ardour.log
|
||||||
|
|
||||||
|
# Complete setup for MCP development
|
||||||
|
setup-mcp: configure-osc build osc-info mcp-info
|
||||||
|
@echo ""
|
||||||
|
@echo "Setup complete! Next steps:"
|
||||||
|
@echo "1. Run: just run-osc-debug"
|
||||||
|
@echo "2. Enable OSC in Ardour (Edit > Preferences > Control Surfaces)"
|
||||||
|
@echo "3. Start ardour-mcp server"
|
||||||
|
|
||||||
|
# Quick reference card
|
||||||
|
help:
|
||||||
|
@echo "Ardour Development Quick Reference"
|
||||||
|
@echo "==================================="
|
||||||
|
@echo ""
|
||||||
|
@echo "Common Workflows:"
|
||||||
|
@echo " just dev - Configure, build, and run (debug mode)"
|
||||||
|
@echo " just osc-dev - Build with OSC support and run with OSC debug"
|
||||||
|
@echo " just setup-mcp - Complete setup for MCP integration"
|
||||||
|
@echo ""
|
||||||
|
@echo "Building:"
|
||||||
|
@echo " just configure - Configure build"
|
||||||
|
@echo " just build - Build with 4 parallel jobs"
|
||||||
|
@echo " just rebuild - Clean and rebuild"
|
||||||
|
@echo " just fresh - Complete fresh build"
|
||||||
|
@echo ""
|
||||||
|
@echo "Running:"
|
||||||
|
@echo " just run - Run Ardour from build directory"
|
||||||
|
@echo " just run-osc-debug - Run with OSC debugging enabled"
|
||||||
|
@echo " just run-debug-all - Run with all debug output"
|
||||||
|
@echo ""
|
||||||
|
@echo "OSC & MCP:"
|
||||||
|
@echo " just osc-info - Show OSC configuration info"
|
||||||
|
@echo " just mcp-info - Show MCP integration info"
|
||||||
|
@echo " just check-osc - Verify OSC library was built"
|
||||||
|
@echo " just test-osc-connection - Test OSC port connectivity"
|
||||||
|
@echo ""
|
||||||
|
@echo "Maintenance:"
|
||||||
|
@echo " just clean - Clean build artifacts"
|
||||||
|
@echo " just distclean - Complete clean"
|
||||||
|
@echo " just info - Show build information"
|
||||||
|
@echo ""
|
||||||
|
@echo "For full command list: just --list"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue