{"id":31375990,"url":"https://github.com/shabeer-wms/padvibe","last_synced_at":"2026-02-16T11:16:33.199Z","repository":{"id":314739335,"uuid":"1056518355","full_name":"shabeer-wms/padvibe","owner":"shabeer-wms","description":"PadVibe — cross‑platform Flutter app (macOS‑first) with drag‑and‑drop, multi‑window, file picking, and SoLoud‑based audio.","archived":false,"fork":false,"pushed_at":"2026-02-12T14:46:48.000Z","size":34641,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-02-12T23:18:11.447Z","etag":null,"topics":["audio","audio-playback","cocoapods","dart","desktop-app","drag-and-drop","file-picker","flutter","flutter-desktop","free","linux","macos","multi-window","open-source","opensource","soloud","web","windows","xcode"],"latest_commit_sha":null,"homepage":"https://padvibe.pro26.in","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shabeer-wms.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES_SUMMARY.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-14T09:08:16.000Z","updated_at":"2026-02-12T14:53:06.000Z","dependencies_parsed_at":"2025-09-14T14:27:32.608Z","dependency_job_id":"8d19bbe2-4eea-4ef6-9d7a-cdcb9f78e31f","html_url":"https://github.com/shabeer-wms/padvibe","commit_stats":null,"previous_names":["shabeer-wms/audio_pads","shabeer-wms/padvibe"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/shabeer-wms/padvibe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shabeer-wms%2Fpadvibe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shabeer-wms%2Fpadvibe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shabeer-wms%2Fpadvibe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shabeer-wms%2Fpadvibe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shabeer-wms","download_url":"https://codeload.github.com/shabeer-wms/padvibe/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shabeer-wms%2Fpadvibe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29506679,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-16T09:05:14.864Z","status":"ssl_error","status_checked_at":"2026-02-16T08:55:59.364Z","response_time":115,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio","audio-playback","cocoapods","dart","desktop-app","drag-and-drop","file-picker","flutter","flutter-desktop","free","linux","macos","multi-window","open-source","opensource","soloud","web","windows","xcode"],"created_at":"2025-09-28T02:53:20.466Z","updated_at":"2026-02-16T11:16:33.193Z","avatar_url":"https://github.com/shabeer-wms.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PadVibe 🎚️\n\n[![Flutter](https://img.shields.io/badge/Flutter-3.x-blue?logo=flutter)](https://flutter.dev)\n[![Python](https://img.shields.io/badge/Python-3.9+-3776AB?logo=python\u0026logoColor=white)](https://www.python.org/)\n[![Platform](https://img.shields.io/badge/Platform-macOS%20|%20Windows%20|%20Linux-lightgrey)](https://flutter.dev/desktop)\n[![License](https://img.shields.io/badge/License-MIT-green)](LICENSE)\n\n**PadVibe** is a professional-grade, cross-platform audio sample triggering application. It combines the expressive UI capabilities of **Flutter** with a high-performance **Python Sidecar** audio engine to deliver low-latency playback, advanced routing, and real-time DSP.\n\n---\n\n## 🏗️ Architecture: The Sidecar Pattern\n\nPadVibe employs a unique **Dual-Engine Architecture**. While Flutter handles the complex UI and state management, a dedicated Python process (the \"Sidecar\") manages the heavy lifting of audio and MIDI.\n\n### 🔌 Communication Flow\n1.  **Flutter (Client):** Sends JSON commands via **WebSockets**.\n2.  **Dynamic Port Discovery:** The Sidecar automatically finds an available port (8765-8775) and broadcasts it to Flutter for a seamless handshake.\n3.  **Python Sidecar (Server):** Executes audio playback, DSP, and MIDI polling.\n4.  **Real-time Feedback:** The Sidecar streams audio levels (RMS/Peak) and MIDI events back to Flutter for immediate UI updates.\n\n---\n\n## ✨ Key Features\n\n### 🎧 Pro Audio Engine\n- **Multi-Device Routing:** Assign individual pads to specific hardware output channels or different audio interfaces entirely.\n- **Dynamic DSP:** Real-time Low-pass and High-pass filters for every pad.\n- **Soft Limiter:** Integrated `tanh` soft-knee limiting on the master bus to prevent digital clipping.\n- **Waveform Visualization:** High-fidelity waveform generation for every sample.\n- **Professional Metering:** L/R channel independent RMS and Peak meters with ballistics and peak-hold.\n- **Heartbeat System:** Constant 60FPS UI updates ensure progress bars and spectrum monitors remain fluid, even for background tasks.\n\n### 🎹 MIDI \u0026 Control\n- **RODECaster Pro Support:** Advanced MIDI handling with a unique Trigger ID system that supports channel-specific messages (essential for RODECaster pads).\n- **Mixer Panel:** Create multiple software faders, link them to groups of pads, and control them all via a single physical MIDI slider.\n- **MIDI Learn:** Map any pad or mixer fader to any MIDI note or CC on your external controllers.\n- **Keyboard Shortcuts:** Global and local hotkeys for instant triggering.\n- **Local API:** Built-in HTTP server (Port 9696) and Webhooks allow external software to monitor and control PadVibe's state.\n\n### 🖥️ UX \u0026 Workflow\n- **Tabbed Layouts:** Organize your performance into multiple groups/banks.\n- **Background Pads:** Mark pads as \"Background\" to exclude them from API states and the Master Timer—perfect for ambient beds or long-running backing tracks.\n- **Drag \u0026 Drop:** Instant sample loading by dropping files onto pads.\n- **Multi-Window:** Detachable timer overlay for performance tracking.\n- **SQLite Storage:** Robust data persistence for all pads, groups, mixer settings, and preferences.\n\n---\n\n## 📂 Project Structure\n\n```text\npadvibe/\n├── lib/                        # Flutter Application\n│   ├── app/\n│   │   ├── data/               # Models (Pad, PadGroup, Fader)\n│   │   ├── modules/            # UI Modules (Home, Splash, Timer)\n│   │   ├── routes/             # GetX Routing\n│   │   └── service/            # Core Services\n│   │       ├── audio_engine_service.dart   # WS Communication\n│   │       ├── audio_player_service.dart   # High-level Logic\n│   │       ├── midi_interface_service.dart # MIDI Logic\n│   │       ├── sidecar_service.dart        # Process Management\n│   │       └── storage_service.dart        # SQLite Persistence\n│   └── main.dart               # Entry point\n├── sidecar/                    # Python Audio/MIDI Engine\n│   ├── audio_engine.py         # sounddevice/numpy DSP \u0026 Playback\n│   ├── midi_engine.py          # mido MIDI Listener\n│   ├── midi_server.py          # WebSocket Server\n│   └── build_sidecar.sh        # PyInstaller Build Script\n├── assets/                     # UI Assets \u0026 Screenshots\n└── native_lib/                 # Native C++ bridges (if any)\n```\n\n---\n\n## 🚀 Getting Started\n\n### Prerequisites\n- **Flutter SDK:** 3.x\n- **Python:** 3.9+ with `pip`\n- **Native Tools:** \n  - macOS: `xcode-select --install`\n  - Linux: `libgtk-3-dev`, `libasound2-dev`, `libjack-dev`\n\n### Installation\n1.  **Clone the repo:**\n    ```bash\n    git clone https://github.com/shabeer-wms/padvibe.git\n    cd padvibe\n    ```\n2.  **Install Python dependencies:**\n    ```bash\n    pip install -r sidecar/requirements.txt\n    ```\n3.  **Get Flutter packages:**\n    ```bash\n    flutter pub get\n    ```\n4.  **Run (Development):**\n    ```bash\n    flutter run\n    ```\n\n---\n\n## 🛠️ Tech Stack\n\n| Component | Technology |\n| :--- | :--- |\n| **Frontend** | Flutter, GetX (State), Desktop Multi-Window |\n| **Backend** | Python 3, Websockets (asyncio) |\n| **Audio** | sounddevice, soundfile, NumPy (DSP) |\n| **MIDI** | mido, python-rtmidi |\n| **Storage** | SQLite (sqflite_common_ffi), Persistence |\n\n---\n\n## 🤝 Contributing\nContributions are welcome! Please read our contributing guidelines and ensure you follow the established code style for both Dart and Python.\n\n## 📄 License\nTBD - See LICENSE file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshabeer-wms%2Fpadvibe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshabeer-wms%2Fpadvibe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshabeer-wms%2Fpadvibe/lists"}