add sound capability to vsrc

see https://sourceforge.net/p/ngspice/patches/13/
This commit is contained in:
Holger Vogt 2020-07-31 17:42:50 +02:00
parent df6ba94ee6
commit 1c3fefa1f3
6 changed files with 44 additions and 1 deletions

View File

@ -23,6 +23,8 @@ IFparm VSRCpTable[] = { /* parameters */
IOP ("am", VSRC_AM, IF_REALVEC,"Amplitude modulation description"), IOP ("am", VSRC_AM, IF_REALVEC,"Amplitude modulation description"),
IOP ("trnoise", VSRC_TRNOISE, IF_REALVEC,"Transient noise description"), IOP ("trnoise", VSRC_TRNOISE, IF_REALVEC,"Transient noise description"),
IOP ("trrandom", VSRC_TRRANDOM, IF_REALVEC,"random source description"), IOP ("trrandom", VSRC_TRRANDOM, IF_REALVEC,"random source description"),
IP ("snd", VSRC_SOUND, IF_REALVEC,"External sound source parameters"),
OPU ("file", VSRC_FILE, IF_STRING, "External sound source filename"),
#ifdef SHARED_MODULE #ifdef SHARED_MODULE
IOP ("external", VSRC_EXTERNAL, IF_STRING,"external source description"), IOP ("external", VSRC_EXTERNAL, IF_STRING,"external source description"),
#endif #endif

View File

@ -322,6 +322,11 @@ VSRCaccept(CKTcircuit *ckt, GENmodel *inModel)
} }
break; break;
case SOUND: {
/* no breakpoints (yet) */
}
break;
#ifdef SHARED_MODULE #ifdef SHARED_MODULE
case EXTERNAL: { case EXTERNAL: {
/* no breakpoints (yet) */ /* no breakpoints (yet) */

View File

@ -48,6 +48,7 @@ VSRCask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *
case VSRC_AM: case VSRC_AM:
case VSRC_TRNOISE: case VSRC_TRNOISE:
case VSRC_TRRANDOM: case VSRC_TRRANDOM:
case VSRC_SOUND:
case VSRC_FCN_COEFFS: case VSRC_FCN_COEFFS:
temp = value->v.numValue = here->VSRCfunctionOrder; temp = value->v.numValue = here->VSRCfunctionOrder;
v = value->v.vec.rVec = TMALLOC(double, here->VSRCfunctionOrder); v = value->v.vec.rVec = TMALLOC(double, here->VSRCfunctionOrder);

View File

@ -154,7 +154,8 @@ enum {
AM, AM,
TRNOISE, TRNOISE,
TRRANDOM, TRRANDOM,
EXTERNAL EXTERNAL,
SOUND
#ifdef RFSPICE #ifdef RFSPICE
, ,
PORT PORT
@ -199,6 +200,8 @@ enum {
VSRC_TRNOISE, VSRC_TRNOISE,
VSRC_TRRANDOM, VSRC_TRRANDOM,
VSRC_EXTERNAL, VSRC_EXTERNAL,
VSRC_SOUND,
VSRC_FILE,
}; };
/* model parameters */ /* model parameters */

View File

@ -12,6 +12,7 @@ Modified: 2000 AlansFixes
#include "ngspice/suffix.h" #include "ngspice/suffix.h"
#include "ngspice/1-f-code.h" #include "ngspice/1-f-code.h"
#include "ngspice/compatmode.h" #include "ngspice/compatmode.h"
#include "vsjack.h"
#ifdef XSPICE_EXP #ifdef XSPICE_EXP
/* gtri - begin - wbk - modify for supply ramping option */ /* gtri - begin - wbk - modify for supply ramping option */
@ -423,6 +424,12 @@ VNoi3 3 0 DC 0 TRNOISE(0 0 0 0 15m 22u 50u) : generate RTS noise
} }
break; break;
case SOUND: {
value = here->VSRCcoeffs[2] * vsjack_get_value((int)here->VSRCcoeffs[0], time, here->VSRCcoeffs[3], (int)rint(here->VSRCcoeffs[4]), rint(here->VSRCcoeffs[5]));
value += here->VSRCcoeffs[1];
}
break;
#ifdef SHARED_MODULE #ifdef SHARED_MODULE
case EXTERNAL: { case EXTERNAL: {
value = getvsrcval(time, here->VSRCname); value = getvsrcval(time, here->VSRCname);

View File

@ -12,6 +12,8 @@ Modified: 2000 AlansFixes
#include "ngspice/sperror.h" #include "ngspice/sperror.h"
#include "ngspice/suffix.h" #include "ngspice/suffix.h"
#include "ngspice/1-f-code.h" #include "ngspice/1-f-code.h"
#include "vsjack.h"
static void copy_coeffs(VSRCinstance *here, IFvalue *value) static void copy_coeffs(VSRCinstance *here, IFvalue *value)
@ -34,6 +36,8 @@ int
VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
{ {
int i; int i;
static char* jfile = NULL;
VSRCinstance *here = (VSRCinstance *) inst; VSRCinstance *here = (VSRCinstance *) inst;
NG_IGNORE(select); NG_IGNORE(select);
@ -285,6 +289,27 @@ VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
} }
break; break;
case VSRC_FILE: {
jfile = strdup(value->sValue);
}
break;
case VSRC_SOUND: {
here->VSRCfunctionType = SOUND;
here->VSRCfuncTGiven = TRUE;
here->VSRCcoeffs = value->v.vec.rVec;
here->VSRCcoeffsGiven = TRUE;
vsjack_open(-1); // initialize
if (jfile) {
vsjack_set_file((int)rint(here->VSRCcoeffs[0]), jfile);
tfree(jfile);
}
if (value->v.numValue != 6)
fprintf(stderr, "Warning! invalid jack args: %i\nFormat: jack(id v_off v_mult t_off channel oversampling)", value->v.numValue);
vsjack_open((int)rint(here->VSRCcoeffs[0]));
}
break;
#ifdef SHARED_MODULE #ifdef SHARED_MODULE
case VSRC_EXTERNAL: { case VSRC_EXTERNAL: {
here->VSRCfunctionType = EXTERNAL; here->VSRCfunctionType = EXTERNAL;