|
Packit Service |
b98cfc |
/* -*- mode:C++; indent-tabs-mode:t; tab-width:8; c-basic-offset: 8 -*- */
|
|
Packit Service |
b98cfc |
/*
|
|
Packit Service |
b98cfc |
*
|
|
Packit Service |
b98cfc |
* Copyright (c) 2003 by Karsten Wiese <annabellesgarden@yahoo.de>
|
|
Packit Service |
b98cfc |
* Copyright (c) 2004-2007 by Rui Nuno Capela <rncbc@rncbc.org>
|
|
Packit Service |
b98cfc |
*
|
|
Packit Service |
b98cfc |
* This program is free software; you can redistribute it and/or modify
|
|
Packit Service |
b98cfc |
* it under the terms of the GNU General Public License as published by
|
|
Packit Service |
b98cfc |
* the Free Software Foundation; either version 2 of the License, or
|
|
Packit Service |
b98cfc |
* (at your option) any later version.
|
|
Packit Service |
b98cfc |
*
|
|
Packit Service |
b98cfc |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
b98cfc |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
b98cfc |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
b98cfc |
* GNU General Public License for more details.
|
|
Packit Service |
b98cfc |
*
|
|
Packit Service |
b98cfc |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
b98cfc |
* along with this program; if not, write to the Free Software
|
|
Packit Service |
b98cfc |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit Service |
b98cfc |
*/
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
#include <alsa/asoundlib.h>
|
|
Packit Service |
b98cfc |
#include "Cus428Midi.h"
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
char Cus428Midi::KnobParam[] = {
|
|
Packit Service |
b98cfc |
0x17,
|
|
Packit Service |
b98cfc |
0x16,
|
|
Packit Service |
b98cfc |
0x15,
|
|
Packit Service |
b98cfc |
0x14,
|
|
Packit Service |
b98cfc |
0x13,
|
|
Packit Service |
b98cfc |
0x2A,
|
|
Packit Service |
b98cfc |
0x29,
|
|
Packit Service |
b98cfc |
0x28,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
0x10,
|
|
Packit Service |
b98cfc |
0x11,
|
|
Packit Service |
b98cfc |
0x18,
|
|
Packit Service |
b98cfc |
0x19,
|
|
Packit Service |
b98cfc |
0x1A,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
0x2C,
|
|
Packit Service |
b98cfc |
0x2D,
|
|
Packit Service |
b98cfc |
0x2E,
|
|
Packit Service |
b98cfc |
0x2F,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
0x20,
|
|
Packit Service |
b98cfc |
0x21,
|
|
Packit Service |
b98cfc |
0x22,
|
|
Packit Service |
b98cfc |
0x23,
|
|
Packit Service |
b98cfc |
0x24,
|
|
Packit Service |
b98cfc |
0x25,
|
|
Packit Service |
b98cfc |
0x26,
|
|
Packit Service |
b98cfc |
0x27,
|
|
Packit Service |
b98cfc |
0,
|
|
Packit Service |
b98cfc |
1,
|
|
Packit Service |
b98cfc |
2,
|
|
Packit Service |
b98cfc |
3,
|
|
Packit Service |
b98cfc |
4,
|
|
Packit Service |
b98cfc |
5,
|
|
Packit Service |
b98cfc |
6,
|
|
Packit Service |
b98cfc |
7,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
(char)-1,
|
|
Packit Service |
b98cfc |
0x30,
|
|
Packit Service |
b98cfc |
0x31,
|
|
Packit Service |
b98cfc |
0x32,
|
|
Packit Service |
b98cfc |
0x33,
|
|
Packit Service |
b98cfc |
0x34,
|
|
Packit Service |
b98cfc |
0x35,
|
|
Packit Service |
b98cfc |
0x36,
|
|
Packit Service |
b98cfc |
0x37,
|
|
Packit Service |
b98cfc |
};
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
extern int verbose;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
// Parse and dispatch input MIDI events.
|
|
Packit Service |
b98cfc |
void Cus428Midi::ProcessMidiEvents()
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
snd_seq_event_t *ev;
|
|
Packit Service |
b98cfc |
unsigned char *data;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
do {
|
|
Packit Service |
b98cfc |
ev = NULL;
|
|
Packit Service |
b98cfc |
snd_seq_event_input(Seq, &ev;;
|
|
Packit Service |
b98cfc |
if (ev == NULL)
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
switch (ev->type) {
|
|
Packit Service |
b98cfc |
case SND_SEQ_EVENT_SYSEX:
|
|
Packit Service |
b98cfc |
data = (unsigned char *) ev->data.ext.ptr;
|
|
Packit Service |
b98cfc |
if (data[1] == 0x7f && data[3] == 0x06) {
|
|
Packit Service |
b98cfc |
// MMC Command code is in data[4]...
|
|
Packit Service |
b98cfc |
if (verbose > 1)
|
|
Packit Service |
b98cfc |
fprintf(stderr, "MMC Command 0x%02x: ", data[4]);
|
|
Packit Service |
b98cfc |
switch (data[4]) {
|
|
Packit Service |
b98cfc |
case MMC_CMD_STOP:
|
|
Packit Service |
b98cfc |
if (verbose > 1)
|
|
Packit Service |
b98cfc |
fprintf(stderr, "STOP.\n");
|
|
Packit Service |
b98cfc |
OneState->TransportSet(T_STOP, true);
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case MMC_CMD_PLAY:
|
|
Packit Service |
b98cfc |
case MMC_CMD_DEFERRED_PLAY:
|
|
Packit Service |
b98cfc |
if (verbose > 1)
|
|
Packit Service |
b98cfc |
fprintf(stderr, "PLAY.\n");
|
|
Packit Service |
b98cfc |
OneState->TransportSet(T_PLAY, true);
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case MMC_CMD_FAST_FORWARD:
|
|
Packit Service |
b98cfc |
if (verbose > 1)
|
|
Packit Service |
b98cfc |
fprintf(stderr, "FFWD.\n");
|
|
Packit Service |
b98cfc |
OneState->TransportSet(T_F_FWD, true);
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case MMC_CMD_REWIND:
|
|
Packit Service |
b98cfc |
if (verbose > 1)
|
|
Packit Service |
b98cfc |
fprintf(stderr, "REW.\n");
|
|
Packit Service |
b98cfc |
OneState->TransportSet(T_REW, true);
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case MMC_CMD_RECORD_STROBE:
|
|
Packit Service |
b98cfc |
case MMC_CMD_RECORD_PAUSE:
|
|
Packit Service |
b98cfc |
if (verbose > 1)
|
|
Packit Service |
b98cfc |
fprintf(stderr, "RECORD ON.\n");
|
|
Packit Service |
b98cfc |
OneState->TransportSet(T_RECORD, true);
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case MMC_CMD_RECORD_EXIT:
|
|
Packit Service |
b98cfc |
if (verbose > 1)
|
|
Packit Service |
b98cfc |
fprintf(stderr, "RECORD OFF.\n");
|
|
Packit Service |
b98cfc |
OneState->TransportSet(T_RECORD, false);
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case MMC_CMD_LOCATE:
|
|
Packit Service |
b98cfc |
if (verbose > 1)
|
|
Packit Service |
b98cfc |
fprintf(stderr, "LOCATE.\n");
|
|
Packit Service |
b98cfc |
OneState->LocateWheel(&data[7]);
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case MMC_CMD_MASKED_WRITE:
|
|
Packit Service |
b98cfc |
if (verbose > 1)
|
|
Packit Service |
b98cfc |
fprintf(stderr, "MASKED WRITE.\n");
|
|
Packit Service |
b98cfc |
OneState->MaskedWrite(&data[6]);
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case MMC_CMD_MMC_RESET:
|
|
Packit Service |
b98cfc |
if (verbose > 1)
|
|
Packit Service |
b98cfc |
fprintf(stderr, "MMC RESET.\n");
|
|
Packit Service |
b98cfc |
OneState->MmcReset();
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
default:
|
|
Packit Service |
b98cfc |
if (verbose > 1)
|
|
Packit Service |
b98cfc |
fprintf(stderr, "Not implemented.\n");
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
} // Look for Tascam US-224/US-428(?) specific LED codes.
|
|
Packit Service |
b98cfc |
else if (data[1] == 0x4e && data[3] == 0x12) {
|
|
Packit Service |
b98cfc |
if (verbose > 1)
|
|
Packit Service |
b98cfc |
fprintf(stderr, "TASCAM Command 0x%02x.\n", data[4]);
|
|
Packit Service |
b98cfc |
// Transport LEDs.
|
|
Packit Service |
b98cfc |
switch (data[4]) {
|
|
Packit Service |
b98cfc |
case 0x01: // Transport LEDs...
|
|
Packit Service |
b98cfc |
switch(data[5]) {
|
|
Packit Service |
b98cfc |
case 0x13: // REWIND.
|
|
Packit Service |
b98cfc |
OneState->LightSet(Cus428State::eL_Rew, data[6]);
|
|
Packit Service |
b98cfc |
OneState->LightSend();
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case 0x14: // FFWD.
|
|
Packit Service |
b98cfc |
OneState->LightSet(Cus428State::eL_FFwd, data[6]);
|
|
Packit Service |
b98cfc |
OneState->LightSend();
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case 0x16: // PLAY.
|
|
Packit Service |
b98cfc |
OneState->LightSet(Cus428State::eL_Play, data[6]);
|
|
Packit Service |
b98cfc |
OneState->LightSend();
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case 0x17: // REC.
|
|
Packit Service |
b98cfc |
OneState->LightSet(Cus428State::eL_Record, data[6]);
|
|
Packit Service |
b98cfc |
OneState->LightSend();
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
default:
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case 0x02: // Mute LEDs
|
|
Packit Service |
b98cfc |
OneState->LightSet(Cus428State::eL_Mute0 + data[5], data[6]);
|
|
Packit Service |
b98cfc |
OneState->LightSend();
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case 0x03: // Select LEDs
|
|
Packit Service |
b98cfc |
OneState->LightSet(Cus428State::eL_Select0 + data[5], data[6]);
|
|
Packit Service |
b98cfc |
OneState->LightSend();
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case 0x04: // Record LEDs
|
|
Packit Service |
b98cfc |
OneState->LightSet(Cus428State::eL_Rec0 + data[5], data[6]);
|
|
Packit Service |
b98cfc |
OneState->LightSend();
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case 0x05: // Null LED
|
|
Packit Service |
b98cfc |
OneState->LightSet(Cus428State::eL_Null, data[5]);
|
|
Packit Service |
b98cfc |
OneState->LightSend();
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case 0x06: // Solo LED
|
|
Packit Service |
b98cfc |
OneState->LightSet(Cus428State::eL_Solo, data[5]);
|
|
Packit Service |
b98cfc |
OneState->LightSend();
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case 0x07: // Bank L LED
|
|
Packit Service |
b98cfc |
OneState->LightSet(Cus428State::eL_BankL, data[5]);
|
|
Packit Service |
b98cfc |
OneState->LightSend();
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case 0x08: // Bank R LED
|
|
Packit Service |
b98cfc |
OneState->LightSet(Cus428State::eL_BankR, data[5]);
|
|
Packit Service |
b98cfc |
OneState->LightSend();
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case 0x10: // Dump fader position.
|
|
Packit Service |
b98cfc |
OneState->SliderSend(data[5]);
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
default:
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
snd_seq_free_event(ev);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
while (snd_seq_event_input_pending(Seq, 0) > 0);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
// Send MMC command.
|
|
Packit Service |
b98cfc |
void Cus428Midi::SendMmcCommand(unsigned char MmcCmd, unsigned char *MmcData, unsigned char MmcLen)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
unsigned char SysexSize;
|
|
Packit Service |
b98cfc |
unsigned char SysexLen;
|
|
Packit Service |
b98cfc |
unsigned char *SysexData;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
SysexSize = 6;
|
|
Packit Service |
b98cfc |
if (MmcLen > 0)
|
|
Packit Service |
b98cfc |
SysexSize += 1 + MmcLen;
|
|
Packit Service |
b98cfc |
SysexData = (unsigned char *) alloca(SysexSize);
|
|
Packit Service |
b98cfc |
SysexLen = 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
SysexData[SysexLen++] = 0xf0; // Sysex header.
|
|
Packit Service |
b98cfc |
SysexData[SysexLen++] = 0x7f; // Realtime sysex.
|
|
Packit Service |
b98cfc |
SysexData[SysexLen++] = 0x7f; // All-caller-id.
|
|
Packit Service |
b98cfc |
SysexData[SysexLen++] = 0x06; // MMC command mode.
|
|
Packit Service |
b98cfc |
SysexData[SysexLen++] = MmcCmd; // MMC command code.
|
|
Packit Service |
b98cfc |
if (MmcData && MmcLen > 0) {
|
|
Packit Service |
b98cfc |
SysexData[SysexLen++] = MmcLen;
|
|
Packit Service |
b98cfc |
memcpy(&SysexData[SysexLen], MmcData, MmcLen);
|
|
Packit Service |
b98cfc |
SysexLen += MmcLen;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
SysexData[SysexLen++] = 0xf7; // Sysex trailer.
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
snd_seq_ev_set_sysex(&Ev, SysexLen, SysexData);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
SubMitEvent();
|
|
Packit Service |
b98cfc |
}
|