|
Next: MIDI Handler Header, midi.h
Up: MIDI Controller
Previous: MIDI Controller
  Contents
This code is the main MIDI control program. It simply exchanges MIDI-like
information over serial ports between the DACS control board, mixer unit,
and a separate host PC running a MIDI sequencing package and a special
serial port MIDI driver.
/*****************************************************************************
* DACS : Distributed Audio Control System
*============================================================================
* File: midictrl.c
* Author: Stephen S. Richardson
* Date Created: 04.18.97
* Environment: GNU C Compiler (GCC) v2.7.1, Linux i486 v2.0.28
* Build: make
*============================================================================
* The code, executables, documentation, firmware images, and all related
* material of DACS are
* Copyright (C) 1997 Stephen S. Richardson - ALL RIGHTS RESERVED
*****************************************************************************/
/*
* most of this code is a pretty ugly hack.. it was written hastily to get
* a demo working for presentation day.
*
* implements "dumb" mode of control board, mixer unit, cdrom
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/types.h>
#include <time.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <netdb.h>
#include "midi.h"
#include "mixer.h"
#include "client.h"
#include "cdaudio_comm.h"
void oops (char *mesg)
{
perror (mesg);
exit (1);
}
void main (void)
{
struct midi_stream board, mixer, midi;
struct mix_control mctrl;
unsigned char ch, obuf[10];
int r;
int sock_cd;
char buf_cd[CD_TCP_BUFSIZE];
struct cdtype *cd;
printf ("DACS : Distributed Audio Control System\nCopyright (C) 1997 Stephen S. Richardson / SR Engineering\n\n");
/* connect with CD audio server */
printf ("Contacting CD audio server...");
sock_cd = tcpEstablishConn ("localhost", CD_TCP_PORT);
if (sock_cd<0) oops ("tcpEstablishConn (cd audio)");
printf ("OK.\n");
cd=(struct cdtype *) buf_cd;
/* open serial & MIDI devices */
midi.fd=midi_openser("/dev/cua1", B38400); /* Windows generic serial MIDI */
mixer.fd=midi_openser("/dev/cua2", B9600); /* DACS 411 mixer serial MIDI */
board.fd=midi_openser("/dev/cua0", B9600); /* DACS 112 ctrlr serial MIDI */
if (!midi.fd) oops ("can't open midi device...");
if (!mixer.fd) oops ("can't open mixer device...");
if (!board.fd) oops ("can't open board device...");
mixer_reset(&mixer);
for (r=0;r<128;r++) mctrl.chipreg[r]=0xff;
while (1) {
if (midi_datawaiting(&midi)) {
/* there's data waiting from the MIDI host */
midi_readstream (&midi); /* get it.. */
if (midi.validdata) {
/* we've received a whole valid command */
switch (midi.cmd) {
case MIDICMD_CONTROL:
/* it was a MIDI controller message */
if (midi.chan==0x0F) {
/* hardcoded hack: if it's channel 15, it's going to the mixer */
printf ("MIDI controller %x to value %x on channel %x\n", midi.data[0], midi.data[1], midi.chan);
/* change the controller table */
mctrl.midictrl[midi.data[0]-1]=midi.data[1];
/* call the controller translate routine */
controller_translate (&mctrl, mixer.fd);
}
break;
case MIDICMD_PROGRAM:
/* MIDI program change */
if (midi.chan==0x0E) {
/* another egregious hack, if it's on channel 14, we control the
CD-ROM, and choose which disc to load */
printf ("MIDI program change to %d on channel %x\n", midi.data[0], midi.chan);
/* the cd data structure.. mangle appropriate elements */
cd->disc=midi.data[0];
cd->function=CD_OPEN;
/* talk to CDROM server */
tcpWriteBuffer (sock_cd, buf_cd, CD_TCP_BUFSIZE);
}
break;
case MIDICMD_NOTEON:
/* MIDI note on command */
if (midi.chan==0x0E) {
/* yes, another hack for the demo.. note-on starts a track on
the current cd */
printf ("MIDI note %d on with velocity %d on channel %d\n", midi.data[0], midi.data[1], midi.chan);
cd->function=CD_PLAY;
cd->track=midi.data[0]+1;
cd->s_min=0;
cd->s_sec=1;
cd->d_min=73;
cd->d_sec=0;
tcpWriteBuffer (sock_cd, buf_cd, CD_TCP_BUFSIZE);
}
break;
}
}
} else {
switch (midi.runstatus) {
case MSTOP:
printf ("MIDI stop\n");
/* when the MIDI stop code is received, stop all of our running
functions */
mixer_reset (&mixer);
midi.runstatus = 0;
cd->function=CD_STOP;
tcpWriteBuffer (sock_cd, buf_cd, CD_TCP_BUFSIZE);
cd->function=CD_CLOSE;
tcpWriteBuffer (sock_cd, buf_cd, CD_TCP_BUFSIZE);
break;
case MSTART:
printf ("MIDI start\n");
/* when the MIDI start code is received, reset some stuff.. */
mixer_reset (&mixer);
midi.runstatus = 1;
break;
case MCONT:
break;
}
if (midi_datawaiting(&board)) {
/* there's data waiting on the board's stripped-MIDI channel */
midi_readstream (&board);
if (board.validdata) {
switch (board.cmd) {
case MIDICMD_CONTROL:
if (board.chan==0x00) {
printf ("BOARD controller %x to value %x on channel %x\n", board.data[0], board.data[1], board.chan);
/* send this to the MIDI host on channel 15 */
obuf[0]=0xBF;
obuf[1]=board.data[0]+1;
obuf[2]=board.data[1];
write(midi.fd, obuf, 3);
}
break;
}
}
} else {
}
}
}
}
Steve Richardson
2000-07-06
|
Table of Contents
[Whole document in PDF 1.9MB]
[more photos and information]
|