|   | 
          
            
  
  
  
   
 
 Next: CDROM Service Provider Communications
 Up: MIDI Controller
 Previous: Mixer Mid-Level Driver Header,
     Contents 
 
 
This code handles DACS mixer mid-level functionality.  This code is mostly
responsible for handling single MIDI controller to multiple mixer register
translations (e.g. pan knobs, etc.).
/*****************************************************************************
 * DACS : Distributed Audio Control System
 *============================================================================
 *         File: mixer.c
 *       Author: Stephen S. Richardson
 * Date Created: 04.21.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
 *****************************************************************************/
#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 "mixer.h"
#include "midi.h"
/*****************************************************************************
 * controller_translate
 *
 * translate MIDI controllers to DACS 411 mixer register data.
 * kind of kludgy, but functional.
 *****************************************************************************/
void controller_translate (struct mix_control *mc, int fd)
{
  float lev;
  unsigned char pan, luleft[128], luright[128], newl, newr, obuf[10];
  unsigned char fl1,fl2;
  int i,r;
  for (i=0;i<64;i++) {
    luleft[i]=127;
    luright[i]=(i*2)+1;
  }
  for (i=64;i<128;i++) {
    luleft[i]=127-((i-64)*2);
    luright[i]=127;
  }
  fl1=0;
  fl2=0;
  for (i=0;i<32;i++) {
    
    lev=(float) mc->midictrl[i] / 127.0;
    pan=mc->midictrl[i+64];
    
    newl = (unsigned char) luleft[pan] * lev;
    if (newl != mc->chipreg[i]) {
      mc->chipreg[i] = newl;
      
      if (fl1) usleep(150);
      obuf[0]=MIDICMD_CONTROL;
      obuf[1]=i;
      obuf[2]=newl;
      
      r=0;
      do {
	r+=write (fd, obuf, 3);
      } while (r<3);
      fl2=1;
    }
    newr = (unsigned char) luright[pan] * lev;
    if (newr != mc->chipreg[i+32]) {
      mc->chipreg[i+32] = newr;
      if (fl2) usleep (150);
      obuf[0]=MIDICMD_CONTROL;
      obuf[1]=i+32;
      obuf[2]=newr;
      
      r=0;
      do {
	r+=write (fd, obuf, 3);
      } while (r<3);
      fl1=1;
    }
    
  }
}
/*****************************************************************************
 * mixer_reset
 *
 * resets the DACS mixer.
 *****************************************************************************/
void mixer_reset (struct midi_stream *ms)
{
  int r;
  char resbyte=0xFF;
  r=0;
  do {
    r=write (ms->fd, &resbyte, 1);
  } while (r<1);
}
  
Steve Richardson
2000-07-06
 | 
Table of Contents
 
 
[Whole document in PDF 1.9MB]
 
 
[more photos and information]
 
 |