12-command-art #2

Merged
boomjacky merged 17 commits from 12-command-art into master 2026-05-10 06:42:12 -04:00
10 changed files with 134 additions and 127 deletions
Showing only changes of commit 900619a714 - Show all commits

BIN
src/channel.o Normal file
View File

Binary file not shown.

View File

@@ -1,7 +1,9 @@
// cppcheck-suppress missingIncludeSystem
#include "looper.h"
#include "channel.h"
#include "command.h"
#include "midi.h"
#include "queue.h"
#include <jack/jack.h>
#include <jack/midiport.h>
#include <math.h>
@@ -9,8 +11,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "command.h"
#include "queue.h"
/* Global state (shared across files) */
struct channel_t channels[MAX_CHANNELS];
@@ -36,11 +36,21 @@ static void apply_command(command_t cmd) {
int cur = atomic_load(&channels[cmd.channel].state);
int next;
switch (cur) {
case STATE_IDLE: next = STATE_RECORD; break;
case STATE_RECORD: next = STATE_LOOPING; break;
case STATE_LOOPING: next = STATE_PAUSED; break;
case STATE_PAUSED: next = STATE_LOOPING; break;
default: next = STATE_IDLE; break;
case STATE_IDLE:
next = STATE_RECORD;
break;
case STATE_RECORD:
next = STATE_LOOPING;
break;
case STATE_LOOPING:
next = STATE_PAUSED;
break;
case STATE_PAUSED:
next = STATE_LOOPING;
break;
default:
next = STATE_IDLE;
break;
}
atomic_store(&channels[cmd.channel].state, next);
}

BIN
src/looper.o Normal file
View File

Binary file not shown.

BIN
src/main.o Normal file
View File

Binary file not shown.

View File

@@ -36,35 +36,33 @@ void midi_handle_events(void *port_buffer, jack_nframes_t nframes) {
if (ck) {
atomic_store(&control_key_active, 0);
if (note < 16) {
command_t cmd = { .type = CMD_BIND_CHANNEL, .channel = -1, .data = note };
command_t cmd = {
.type = CMD_BIND_CHANNEL, .channel = -1, .data = note};
queue_push(&cmd_queue, cmd);
} else {
switch (note) {
case 60:
{
command_t cmd = { .type = CMD_ADD_CHANNEL, .channel = -1, .data = 0 };
case 60: {
command_t cmd = {
.type = CMD_ADD_CHANNEL, .channel = -1, .data = 0};
queue_push(&cmd_queue_main_midi, cmd);
} break;
case 61:
{
command_t cmd = { .type = CMD_REMOVE_CHANNEL, .channel = -1, .data = 0 };
case 61: {
command_t cmd = {
.type = CMD_REMOVE_CHANNEL, .channel = -1, .data = 0};
queue_push(&cmd_queue_main_midi, cmd);
} break;
case 62:
{
case 62: {
int bch = atomic_load(&bind_channel);
if (bch >= 0 && bch < MAX_CHANNELS) {
command_t cmd = {.type = CMD_CYCLE, .channel = bch, .data = 0};
queue_push(&cmd_queue, cmd);
}
} break;
case 63:
{
case 63: {
command_t cmd = {.type = CMD_UNBIND, .channel = -1, .data = 0};
queue_push(&cmd_queue, cmd);
} break;
case 65:
{
case 65: {
command_t cmd = {.type = CMD_STOP, .channel = -1, .data = 0};
queue_push(&cmd_queue, cmd);
} break;
@@ -75,19 +73,17 @@ void midi_handle_events(void *port_buffer, jack_nframes_t nframes) {
} else {
/* direct mapping */
switch (note) {
case 1:
{
case 1: {
command_t cmd = {.type = CMD_CYCLE, .channel = 0, .data = 0};
queue_push(&cmd_queue, cmd);
} break;
case 60:
{
case 60: {
command_t cmd = {.type = CMD_ADD_CHANNEL, .channel = -1, .data = 0};
queue_push(&cmd_queue_main_midi, cmd);
} break;
case 61:
{
command_t cmd = { .type = CMD_REMOVE_CHANNEL, .channel = -1, .data = 0 };
case 61: {
command_t cmd = {
.type = CMD_REMOVE_CHANNEL, .channel = -1, .data = 0};
queue_push(&cmd_queue_main_midi, cmd);
} break;
default:

BIN
src/midi.o Normal file
View File

Binary file not shown.

View File

@@ -1,14 +1,14 @@
#include "pipe.h"
#include "queue.h"
#include "command.h"
#include "queue.h"
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#define FIFO_PATH "/tmp/looper_cmd"
#define LINE_MAX 256

BIN
src/pipe.o Normal file
View File

Binary file not shown.

View File

@@ -25,6 +25,7 @@ bool queue_pop(spsc_queue_t *q, command_t *cmd) {
if (t == h)
return false; /* queue empty */
*cmd = q->buffer[t];
atomic_store_explicit(&q->tail, (t + 1) % QUEUE_CAPACITY, memory_order_release);
atomic_store_explicit(&q->tail, (t + 1) % QUEUE_CAPACITY,
memory_order_release);
return true;
}

BIN
src/queue.o Normal file
View File

Binary file not shown.