00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
#include "synthout.h"
00029
#include <unistd.h>
00030
#include <fcntl.h>
00031
#include <stdio.h>
00032
#include "sndcard.h"
00033
#include <sys/ioctl.h>
00034
#include <errno.h>
00035
#include <string.h>
00036
#include <sys/param.h>
00037
#include "awe_sup.h"
00038
#include "midispec.h"
00039
00040
#ifdef HAVE_CONFIG_H
00041
#include <config.h>
00042
#endif
00043
00044 SEQ_USE_EXTBUF();
00045
00046 SynthOut::SynthOut(
int d)
00047 {
00048 seqfd = -1;
00049 devicetype=KMID_SYNTH;
00050 device= d;
00051 _ok=1;
00052 }
00053
00054 SynthOut::~SynthOut()
00055 {
00056
closeDev();
00057 }
00058
00059 void SynthOut::openDev (
int sqfd)
00060 {
00061 _ok=1;
00062 seqfd = sqfd;
00063
if (seqfd==-1)
00064 {
00065 printfdebug(
"ERROR: Could not open /dev/sequencer\n");
00066
return;
00067 }
00068
#ifdef HAVE_OSS_SUPPORT
00069
00070
00071
00072
00073
00074
#ifdef SYNTHOUTDEBUG
00075
printfdebug(
"Number of synth devices : %d\n",ndevs);
00076 printfdebug(
"Number of midi ports : %d\n",nmidiports);
00077 printfdebug(
"Rate : %d\n",m_rate);
00078
#endif
00079
00080
#ifdef HAVE_AWE32
00081
00082
struct synth_info info;
00083
00084
00085
00086 info.device = device;
00087
00088
if (ioctl (seqfd, SNDCTL_SYNTH_INFO, &info) == -1)
00089 printfdebug(
" ioctl SNDCTL_SYNTH_INFO FAILED \n");
00090
00091
if (info.synth_type == SYNTH_TYPE_SAMPLE
00092 && info.synth_subtype == SAMPLE_TYPE_AWE32)
00093 {
00094
00095
00096 AWE_SET_CHANNEL_MODE(device,1);
00097
#ifdef SYNTHOUTDEBUG
00098
printfdebug(
" Found AWE32 dev=%d \n",device);
00099
#endif
00100
}
00101
#endif // HAVE_AWE32
00102
#endif // HAVE_OSS_SUPPORT
00103
00104 }
00105
00106 void SynthOut::closeDev (
void)
00107 {
00108
if (!
ok())
return;
00109
00110 seqfd=-1;
00111 }
00112
00113 void SynthOut::initDev (
void)
00114 {
00115
#ifdef HAVE_OSS_SUPPORT
00116
int chn;
00117
if (!
ok())
return;
00118 uchar gm_reset[5]={0x7e, 0x7f, 0x09, 0x01, 0xf7};
00119
sysex(gm_reset,
sizeof(gm_reset));
00120
for (chn=0;chn<16;chn++)
00121 {
00122 chnmute[chn]=0;
00123
chnPatchChange(chn,0);
00124
chnPressure(chn,127);
00125
chnPitchBender(chn, 0x00, 0x40);
00126
chnController(chn, CTL_MAIN_VOLUME,127);
00127
chnController(chn, CTL_EXT_EFF_DEPTH, 0);
00128
chnController(chn, CTL_CHORUS_DEPTH, 0);
00129
chnController(chn, 0x4a, 127);
00130 }
00131
#endif
00132
}
00133
00134 void SynthOut::noteOn (uchar chn, uchar note, uchar vel)
00135 {
00136
if (vel==0)
00137 {
00138
noteOff(chn,note,vel);
00139 }
00140
else
00141 {
00142 SEQ_START_NOTE(device, map->
channel(chn),
00143 map->
key(chn,chnpatch[chn],note),
00144 vel);
00145 }
00146
#ifdef SYNTHOUTDEBUG
00147
printfdebug(
"Note ON >\t chn : %d\tnote : %d\tvel: %d\n",chn,note,vel);
00148
#endif
00149
}
00150
00151 void SynthOut::noteOff (uchar chn, uchar note, uchar)
00152 {
00153 SEQ_STOP_NOTE(device, map->
channel(chn),
00154 map->
key(chn,chnpatch[chn],note), 0);
00155
#ifdef SYNTHOUTDEBUG
00156
printfdebug(
"Note OFF >\t chn : %d\tnote : %d\tvel: %d\n",chn,note,vel);
00157
#endif
00158
}
00159
00160 void SynthOut::keyPressure (uchar chn, uchar note, uchar vel)
00161 {
00162 SEQ_KEY_PRESSURE(device, map->
channel(chn), map->
key(chn,chnpatch[chn],note),vel);
00163 }
00164
00165 void SynthOut::chnPatchChange (uchar chn, uchar patch)
00166 {
00167 SEQ_SET_PATCH(device,map->
channel(chn),map->
patch(chn,patch));
00168 chnpatch[chn]=patch;
00169 }
00170
00171 void SynthOut::chnPressure (uchar chn, uchar vel)
00172 {
00173 SEQ_CHN_PRESSURE(device, map->
channel(chn) , vel);
00174 chnpressure[chn]=vel;
00175 }
00176
00177 void SynthOut::chnPitchBender(uchar chn,uchar lsb, uchar msb)
00178 {
00179 chnbender[chn]=((
int)msb<<7) | (lsb & 0x7F);
00180 SEQ_BENDER(device, map->
channel(chn), chnbender[chn]);
00181 }
00182
00183 void SynthOut::chnController (uchar chn, uchar ctl, uchar v)
00184 {
00185
if ((ctl==11)||(ctl==7))
00186 {
00187 v=(v*volumepercentage)/100;
00188
if (v>127) v=127;
00189 }
00190
00191 SEQ_CONTROL(device, map->
channel(chn), ctl, v);
00192 chncontroller[chn][ctl]=v;
00193 }
00194
00195 void SynthOut::sysex(uchar *, ulong )
00196 {
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 }