Blame us428control/Cus428Midi.cc

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
}