Import existing source tree; original VCS history is no longer available. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
235 lines
5.4 KiB
C
235 lines
5.4 KiB
C
/*(LGPL)
|
|
---------------------------------------------------------------------------
|
|
a_midisock.c - Generic Interface for Modular MIDI Management
|
|
---------------------------------------------------------------------------
|
|
* Copyright (C) 2001, David Olofson
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation; either version 2.1 of the License, or (at
|
|
* your option) any later version.
|
|
*
|
|
* 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include "a_midisock.h"
|
|
#include "kobolog.h"
|
|
|
|
|
|
/*----------------------------------------------------------
|
|
Dummy MIDI Socket implementation
|
|
----------------------------------------------------------*/
|
|
static void dummy_note_off(unsigned ch, unsigned pitch, unsigned vel) {}
|
|
static void dummy_note_on(unsigned ch, unsigned pitch, unsigned vel) {}
|
|
static void dummy_poly_pressure(unsigned ch, unsigned pitch, unsigned press) {}
|
|
static void dummy_control_change(unsigned ch, unsigned ctrl, unsigned amt) {}
|
|
static void dummy_program_change(unsigned ch, unsigned prog) {}
|
|
static void dummy_channel_pressure(unsigned ch, unsigned press) {}
|
|
static void dummy_pitch_bend(unsigned ch, int amt) {}
|
|
|
|
midisock_t dummy_midisock = {
|
|
dummy_note_off,
|
|
dummy_note_on,
|
|
dummy_poly_pressure,
|
|
dummy_control_change,
|
|
dummy_program_change,
|
|
dummy_channel_pressure,
|
|
dummy_pitch_bend
|
|
};
|
|
|
|
|
|
/*----------------------------------------------------------
|
|
Monitor MIDI Socket implementation
|
|
----------------------------------------------------------*/
|
|
static const char notenames[12][4] = {
|
|
"C-", "C#", "D-", "D#", "E-",
|
|
"F-", "F#", "G-", "G#", "A-", "A#", "B-"
|
|
};
|
|
|
|
static const char *controlnames[128] = {
|
|
/*0..7*/
|
|
"Bank Select MSB",
|
|
"Modulation",
|
|
"Breath Controller",
|
|
NULL,
|
|
"Foot Controller",
|
|
"Portamento Time",
|
|
"Data Entry MSB",
|
|
"Volume",
|
|
/*8..15*/
|
|
"Balance",
|
|
NULL,
|
|
"Pan",
|
|
"Expression",
|
|
"FX Control 1",
|
|
"FX Control 2",
|
|
NULL,
|
|
NULL,
|
|
/*16..23*/
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
/*24..31*/
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
/*32..39*/
|
|
"Bank Select LSB",
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
"Data Entry LSB",
|
|
"BC: Select Insert Slot",
|
|
/*40..47*/
|
|
"BC: IFX Type",
|
|
"BC: IFX Param 1 (Time 1)",
|
|
"BC: IFX Param 2 (Time 2)",
|
|
"BC: IFX Param 3 (Depth 1)",
|
|
"BC: IFX Param 4 (Depth 2)",
|
|
"BC: IFX Param 5 (Rate)",
|
|
"BC: IFX Param 6 (Mode)",
|
|
"BC: Send to Master",
|
|
/*48..55*/
|
|
"BC: Send to Bus 1",
|
|
"BC: Send to Bus 2",
|
|
"BC: Send to Bus 3",
|
|
"BC: Send to Bus 4",
|
|
"BC: Send to Bus 5",
|
|
"BC: Send to Bus 6",
|
|
"BC: Send to Bus 7",
|
|
"BC: Send to Bus 8",
|
|
/*56..63*/
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
/*64..71*/
|
|
"Hold 1",
|
|
"Portamento",
|
|
"Sostenuto",
|
|
"Soft Pedal",
|
|
"Legato",
|
|
"Hold 2",
|
|
"SC 1",
|
|
"SC 2: Harmonic Content",
|
|
/*72..79*/
|
|
"SC 3: Release Time",
|
|
"SC 4: Attack Time",
|
|
"SC 5: Brightness",
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
/*80..87*/
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
"Portamento Control",
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
/*88..95*/
|
|
"BC: Primary Bus Select",
|
|
"BC: Send Bus Select",
|
|
NULL,
|
|
"FX 1 Depth: Reverb",
|
|
"FX 2 Depth",
|
|
"FX 3 Depth: Chorus",
|
|
"FX 4 Depth: Variation",
|
|
"FX 5 Depth",
|
|
/*96..103*/
|
|
"RPN Increment",
|
|
"RPN Decrement",
|
|
"NRPN LSB",
|
|
"NRPN MSB",
|
|
"RPN LSB",
|
|
"RPN MSB",
|
|
NULL,
|
|
NULL,
|
|
/*104..111*/
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
/*112..119*/
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
/*120..127*/
|
|
"All Sound Off",
|
|
"Reset All Controllers",
|
|
NULL,
|
|
"All Notes Off",
|
|
"Omni Off",
|
|
"Omni On",
|
|
"Mono",
|
|
"Poly"
|
|
};
|
|
|
|
#if 0
|
|
#define KNOWN_RPNS 5
|
|
static const char RPNnames[KNOWN_RPNS][24] = {
|
|
"Pitch Bend Sensitivity",
|
|
"Fine Tuning",
|
|
"Coarse Tuning",
|
|
"Tuning Program Select",
|
|
"Tuning Bank Select"
|
|
};
|
|
#endif
|
|
|
|
static void monitor_note_off(unsigned ch, unsigned pitch, unsigned vel)
|
|
{
|
|
log_printf(DLOG, "NoteOff(%u, %s%u(%u), %u)\n", ch,
|
|
notenames[pitch % 12], pitch / 12,
|
|
pitch, vel);
|
|
}
|
|
|
|
static void monitor_note_on(unsigned ch, unsigned pitch, unsigned vel)
|
|
{
|
|
log_printf(DLOG, "NoteOn(%u, %s%u(%u), %u)\n", ch,
|
|
notenames[pitch % 12], pitch / 12,
|
|
pitch, vel);
|
|
}
|
|
|
|
static void monitor_poly_pressure(unsigned ch, unsigned pitch, unsigned press)
|
|
{
|
|
log_printf(DLOG, "PolyPress(%u, %s%u(%u), %u)\n", ch,
|
|
notenames[pitch % 12], pitch / 12,
|
|
pitch, press);
|
|
}
|
|
|
|
static void monitor_control_change(unsigned ch, unsigned ctrl, unsigned amt)
|
|
{
|
|
const char *cn = controlnames[ctrl];
|
|
if(!cn)
|
|
cn = "<unknown>";
|
|
log_printf(DLOG, "ControlChg(%u, %s(%u), %u)\n", ch,
|
|
controlnames[ctrl], ctrl,
|
|
amt);
|
|
}
|
|
|
|
static void monitor_program_change(unsigned ch, unsigned prog)
|
|
{
|
|
log_printf(DLOG, "ProgramChg(%u, %u)\n", ch, prog);
|
|
}
|
|
|
|
static void monitor_channel_pressure(unsigned ch, unsigned press)
|
|
{
|
|
log_printf(DLOG, "ChannelPress(%u, %u)\n", ch, press);
|
|
}
|
|
|
|
static void monitor_pitch_bend(unsigned ch, int amt)
|
|
{
|
|
log_printf(DLOG, "PitchBend(%u, %d)\n", ch, amt);
|
|
}
|
|
|
|
midisock_t monitor_midisock = {
|
|
monitor_note_off,
|
|
monitor_note_on,
|
|
monitor_poly_pressure,
|
|
monitor_control_change,
|
|
monitor_program_change,
|
|
monitor_channel_pressure,
|
|
monitor_pitch_bend
|
|
};
|