From f0835be9ffcae8e5c74c8fc6a0da2f7bc49343ac Mon Sep 17 00:00:00 2001 From: Eddy Pedroni Date: Mon, 21 Jul 2025 18:57:53 +0200 Subject: Initial commit, daemon hello world --- .gitignore | 4 + .gitmodules | 3 + daemon/Makefile | 46 ++++++++ daemon/include/concurrentqueue | 1 + daemon/src/main.cpp | 8 ++ doc/architecture.drawio | 255 +++++++++++++++++++++++++++++++++++++++++ doc/devices.txt | 72 ++++++++++++ doc/sample-config.toml | 11 ++ pacman.txt | 3 + readme.md | 4 + 10 files changed, 407 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 daemon/Makefile create mode 160000 daemon/include/concurrentqueue create mode 100644 daemon/src/main.cpp create mode 100644 doc/architecture.drawio create mode 100644 doc/devices.txt create mode 100644 doc/sample-config.toml create mode 100644 pacman.txt create mode 100644 readme.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2c1230f --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +**/__pycache__/ +**/*.egg-info +**/build +**/*.bkp diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..a85cfec --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "daemon/include/concurrentqueue"] + path = daemon/include/concurrentqueue + url = https://github.com/cameron314/concurrentqueue.git diff --git a/daemon/Makefile b/daemon/Makefile new file mode 100644 index 0000000..e38108f --- /dev/null +++ b/daemon/Makefile @@ -0,0 +1,46 @@ +TARGET_EXEC := midi-router-daemon + +BUILD_DIR := ./build +SRC_DIRS := ./src + +# Find all the C++ files we want to compile +# Note the single quotes around the * expressions. The shell will incorrectly expand these otherwise, but we want to send the * directly to the find command. +SRCS := $(shell find $(SRC_DIRS) -name '*.cpp') + +# Prepends BUILD_DIR and appends .o to every src file +# As an example, ./your_dir/hello.cpp turns into ./build/./your_dir/hello.cpp.o +OBJS := $(SRCS:%=$(BUILD_DIR)/%.o) + +# String substitution (suffix version without %). +# As an example, ./build/hello.cpp.o turns into ./build/hello.cpp.d +DEPS := $(OBJS:.o=.d) + +# Every folder in ./src will need to be passed to GCC so that it can find header files +INC_DIRS := $(shell find $(SRC_DIRS) -type d) ./include +# Add a prefix to INC_DIRS. So moduleA would become -ImoduleA. GCC understands this -I flag +INC_FLAGS := $(addprefix -I,$(INC_DIRS)) + +# The -MMD and -MP flags together generate Makefiles for us! +# These files will have .d instead of .o as the output. +CPPFLAGS := -O3 -std=c++23 $(INC_FLAGS) -MMD -MP + +LDFLAGS := -lrtmidi + +# The final build step. +$(BUILD_DIR)/$(TARGET_EXEC): $(OBJS) + $(CXX) $(OBJS) -o $@ $(LDFLAGS) + +# Build step for C++ source +$(BUILD_DIR)/%.cpp.o: %.cpp + mkdir -p $(dir $@) + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@ + + +.PHONY: clean +clean: + rm -r $(BUILD_DIR) + +# Include the .d makefiles. The - at the front suppresses the errors of missing +# Makefiles. Initially, all the .d files will be missing, and we don't want those +# errors to show up. +-include $(DEPS) diff --git a/daemon/include/concurrentqueue b/daemon/include/concurrentqueue new file mode 160000 index 0000000..6dd38b8 --- /dev/null +++ b/daemon/include/concurrentqueue @@ -0,0 +1 @@ +Subproject commit 6dd38b8a1dbaa7863aa907045f32308a56a6ff5d diff --git a/daemon/src/main.cpp b/daemon/src/main.cpp new file mode 100644 index 0000000..68d0a96 --- /dev/null +++ b/daemon/src/main.cpp @@ -0,0 +1,8 @@ +#include +#include +#include "concurrentqueue/blockingconcurrentqueue.h" + +int main() +{ + std::cout << "Hello, world\n"; +} diff --git a/doc/architecture.drawio b/doc/architecture.drawio new file mode 100644 index 0000000..da8d093 --- /dev/null +++ b/doc/architecture.drawio @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/devices.txt b/doc/devices.txt new file mode 100644 index 0000000..7d3b323 --- /dev/null +++ b/doc/devices.txt @@ -0,0 +1,72 @@ +MPK + +- note_on, note_off + - keys + - pads + +- pitchwheel + - pitchwheel + +- control_change + - modulation wheel + - joystick + - play + - stop + - rec + - next/prev step + - knobs + +Deluge + +- note_on, note_off + - note input + - sequencer pads + +- start + - start button + +- stop + - start button + +- clock + - constantly during playback + +Xjam + +- note_on + - pads (never note_off though...) + +- aftertouch/polytouch + - pads, if enabled + +- control_change + - knobs + +- program_change + - configurable, currently nothing + +OP-1 + +- note_on, note_off + - keys + +- continue + - start button (only with clock out/both) + +- stop + - stop button (only with clock out/both) + +- start + - start button but only from beginning of tape (only with clock out/both) + +- clock + - beat match: constantly sent, even if not playing + +- control_change (only in MIDI control mode) + - 4 knobs + - most non-keyboard keys + +- pitchwheel + - shift+left/right (only when it has the pitch effect also internally) + + diff --git a/doc/sample-config.toml b/doc/sample-config.toml new file mode 100644 index 0000000..fcd294a --- /dev/null +++ b/doc/sample-config.toml @@ -0,0 +1,11 @@ +[devices] +op1 = "OP-1 MIDI 1" +deluge = "Deluge MIDI 1" +mpk = "MPK mini Plus MIDI 1" +xjam = "Xjam MIDI 1" + +[route.from.deluge.to] +op1 = ["start", "stop", "continue"] + +[route.from.deluge.type] +clock = ["all"] diff --git a/pacman.txt b/pacman.txt new file mode 100644 index 0000000..5c1b6ef --- /dev/null +++ b/pacman.txt @@ -0,0 +1,3 @@ +make +clang +rtmidi diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..9e7b20f --- /dev/null +++ b/readme.md @@ -0,0 +1,4 @@ +# MIDI Router + +Routes MIDI messages between USB MIDI devices. Routing configuration supports multicast, broadcast and filtering by message type. + -- cgit v1.2.3