| Excellent. Thanks for the example.
Oeyvind
> From: Istvan Varga [istvan_v@fibermail.hu]
> Sent: 2006-01-09 22:40:57 CET
> To: csound@lists.bath.ac.uk
> Subject: Re: [Csnd] chnget, chnexport, accessing the variable
>
> On Monday 09 January 2006 20:57, Oeyvind Brandtsegg wrote:
>
> > It's hard for me to find my way through the csoundAPI documentation,
> > what is the command for accessing the software bus from a host application ?
> > e.g. in the example from the manual that defines
> > chn_k "cutoff", 1, 3, 1000, 500, 2000
> > ... What command would I use to write to this channel from my host app ?
> >
> > I use
> > csound = csnd.CppSound()
> > and then
> > csound.InputMessage("i 1 0 1 1")
> > to send events.
>
> For simple access to the bus (limited to setting and getting control
> channels, and setting string channels), you can use Csound::SetChannel()
> and Csound::GetChannel(). The first example shows using this interface.
>
> A more advanced example is also included, in which the channels
> exported in the orchestra header are listed after calling
> Csound::Compile(), and pointers to the channel data are used
> later during performance (you may want to read the cs_glue.hpp
> header included with the RC2 release for documentation on the
> various classes used in this example).
>
> ------------------------------------------------------------------------
>
> #!/usr/bin/python
>
> import csnd
>
> csound = csnd.Csound()
>
> f = open('chn_simple_1.csd', 'w')
> print >> f, '''
>
>
> -d -m135 -H0 -s -h -o dac
>
>
> sr = 44100
> ksmps = 100
> nchnls = 2
>
> gkpwd chnexport "PulseWidth", 1
> gkpan chnexport "Pan", 1
>
> instr 1
> a1 vco2 p5, p4, 2, gkpwd
> apanL interp cos(gkpan * 1.57), 0, 1
> apanR interp sin(gkpan * 1.57), 0, 1
> outs a1 * apanL, a1 * apanR
> endin
>
>
> i 1 0 5 220 16000
> e
>
>
> '''
> f.close()
>
> if csound.Compile('chn_simple_1.csd') == 0:
> csound.SetChannel('PulseWidth', 0.95)
> csound.SetChannel('Pan', 1.0)
> while csound.PerformKsmps() == 0:
> curTime = (csound.GetScoreTime() / 5.0) % 1.0
> csound.SetChannel('Pan', 1.0 - curTime)
> csound.SetChannel('PulseWidth', 0.05 + abs(curTime * 1.8 - 0.9))
>
> csound.Reset()
>
> ------------------------------------------------------------------------
>
> #!/usr/bin/python
>
> import csnd
> import wave
> import array
> import math
>
> csound = csnd.Csound()
>
> # create and compile a CSD file
>
> f = open('chntest.csd', 'w')
> print >> f, '''
>
>
> sr = 48000
> ksmps = 32
> nchnls = 1
>
> gkfco init 1000
> gkfco chnexport "FilterFreq", 1, 3, 1000, 200, 4000
> gSfname chnexport "FileName", 1
> gaout chnexport "AudioOutput", 2
>
> instr 1
> printf_i "The file name is: '%s'\\n", 1, gSfname
> a1 vco2 20 / sqrt(gkfco), 220
> a2 pareq a1, gkfco, 0, gkfco / 220, 2
> gaout = taninv(a2) * 0.6
> endin
>
>
>
>
> i 1 0 5
> e
>
>
>
> '''
> f.close()
> err = csound.Compile('-d', '-n', 'chntest.csd')
> if (err != 0):
> raise(SystemExit(err))
>
> # create and print a channel list
>
> controlInput = ''
> audioOutput = ''
> stringInput = ''
>
> chnlst = csnd.CsoundChannelList(csound)
> n = chnlst.Count()
> if n > 0:
> print '============================================================'
> print n, ' channels'
> print '------------------------------------------------------------'
> for i in range(n):
> print 'Name: ', chnlst.Name(i)
> tmp = 'unknown'
> if chnlst.IsControlChannel(i):
> tmp = 'control'
> elif chnlst.IsAudioChannel(i):
> tmp = 'audio'
> elif chnlst.IsStringChannel(i):
> tmp = 'string'
> print 'Type: ', tmp
> print 'Input: ', ['no', 'yes'][chnlst.IsInputChannel(i)]
> print 'Output: ', ['no', 'yes'][chnlst.IsOutputChannel(i)]
> if chnlst.SubType(i) > 0:
> tmp = ['integer', 'linear', 'exponential']
> print 'Subtype: ', tmp[chnlst.SubType(i) - 1]
> print 'Default value: ', chnlst.DefaultValue(i)
> print 'Minimum value: ', chnlst.MinValue(i)
> print 'Maximum value: ', chnlst.MaxValue(i)
> print '------------------------------------------------------------'
> if chnlst.IsControlChannel(i) and chnlst.IsInputChannel(i):
> if chnlst.SubType(i) == csnd.CSOUND_CONTROL_CHANNEL_EXP:
> controlInput = chnlst.Name(i)
> if chnlst.IsAudioChannel(i) and chnlst.IsOutputChannel(i):
> audioOutput = chnlst.Name(i)
> if chnlst.IsStringChannel(i) and chnlst.IsInputChannel(i):
> stringInput = chnlst.Name(i)
>
> # free memory used by the channel list; call this before csound.Reset()
>
> chnlst.Clear()
>
> if controlInput == '' or audioOutput == '':
> csound.Reset()
> raise(SystemExit(0))
>
> # if found an exponential control input channel and an audio output channel,
> # perform the orchestra
>
> # get pointer to the control input channel
> ptr1 = csnd.CsoundMYFLTArray()
> csound.GetChannelPtr(ptr1.GetPtr(), controlInput,
> csnd.CSOUND_CONTROL_CHANNEL + csnd.CSOUND_INPUT_CHANNEL)
> # get pointer to the audio output channel
> ptr2 = csnd.CsoundMYFLTArray()
> csound.GetChannelPtr(ptr2.GetPtr(), audioOutput,
> csnd.CSOUND_AUDIO_CHANNEL + csnd.CSOUND_OUTPUT_CHANNEL)
> # if there is a string input channel, write the file name to it
> if stringInput != '':
> ptr3 = csnd.CsoundMYFLTArray()
> csound.GetChannelPtr(ptr3.GetPtr(), stringInput,
> csnd.CSOUND_STRING_CHANNEL + csnd.CSOUND_INPUT_CHANNEL)
> ptr3.SetStringValue('chntest.wav', csound.GetStrVarMaxLen())
> ptr3 = None
> # get the range of the control channel
> tmp, dflt, minVal, maxVal = csound.GetControlChannelParams(controlInput)
> ksmps = csound.GetKsmps()
>
> # open a 16 bit mono WAV file for storing the audio output
>
> f = wave.open('chntest.wav', 'wb')
> f.setframerate(int(csound.GetSr()))
> f.setnchannels(1)
> f.setsampwidth(2)
> buf = array.array('B')
>
> # writes a floating point sample (-1.0 to 1.0) to the buffer
>
> def writeSample(x):
> nn = int(x * 32767.0)
> if nn < 0:
> if nn > -32768:
> nn = 65536 + nn
> else:
> nn = 32768
> elif nn > 32767:
> nn = 32767
> buf.append(nn & 255)
> buf.append(nn >> 8)
>
> x = maxVal
> c1 = math.pow(0.5, (1.0 / csound.GetKr()))
>
> while 1:
> # set control input
> ptr1.SetValue(0, x)
> x = minVal + ((x - minVal) * c1)
> # perform one control period
> if csound.PerformKsmps() != 0:
> break
> # get audio output
> for i in range(ksmps):
> writeSample(ptr2.GetValue(i))
>
> # write sound file
>
> f.writeframes(buf)
> f.close()
>
> # clean up
>
> csound.Reset()
>
> ------------------------------------------------------------------------
> --
> Send bugs reports to this list.
> To unsubscribe, send email to csound-unsubscribe@lists.bath.ac.uk
>
|