Sophie

Sophie

distrib > Mageia > 5 > x86_64 > media > core-release > by-pkgid > b707d9a4ee443103660a75ccb6e51334 > files > 2160

csound-doc-5.19.01-10.mga5.noarch.rpm

<CsoundSynthesizer>
<CsOptions>
; Change the driver and the device to fit the platform.
; For Linux:
; csound -RWdf -+rtaudio=alsa -odac
; For Windows:
csound -RWdf -+rtaudio=PortAudio -odac
</CsOptions>
<CsInstruments>
sr                              =                       48000
ksmps                           =                       20
nchnls                          =                       2
gSnapshotfile                   =                       "lua_score_generator.snap"
0dbfs					        =                      	1000000

                                lua_exec                {{
                                
local ChordSpace = require("ChordSpace")
local ffi = require("ffi")
local math = require("math")

-- Change the library name to fit the platform.
-- For Windows:
local csoundApi = ffi.load('csound64.dll.5.2')
-- For Linux:
-- local csoundApi = ffi.load('csound64.so.5.2')
ffi.cdef[[
    int csoundScoreEvent(void *csound, char opcode, double *pfields, long pfieldCount);
]]

local scoreEvent = ffi.new('double[11]')
local chord = ChordSpace.chordsForNames['BM7']
local modality = chord:clone()
local status = 144.0
local y = 0.5
local y1 = 0.5
-- SECTION A.
local time_ = 1.0
-- FilteredSines, ChebyDrone, ZakianFlute, ChebyDrone 
local arrangement = {3, 1, 10, 1} 
local velocity = 56.0
local d_velocity = 0.03
local dd_velocity = 0.0
local inc = 3.56
local iterations = 210
local interval = 1.0 / 3.0
local duration = 12 * interval
local i = 0
while i < iterations do
    i = i + 1
    if i % 20 == 0 then
        chord = chord:Q(7, modality)
    end
    if i % 60 == 0 then
        chord = chord:K()
    end
    y1 = inc * y * (1 - y)
    y = y1
    scoreEvent[0] = arrangement[1 + (i % 4)]
    scoreEvent[1] = time_
    time_ = time_ + interval
    scoreEvent[2] = duration
    local key = math.floor(24 + y1 * 72)
    scoreEvent[3] = ChordSpace.conformPitchToChord(key, chord)
    scoreEvent[4] = velocity
    velocity = velocity + d_velocity
    d_velocity = d_velocity + dd_velocity
    scoreEvent[6] = math.random(-1000, 1000) / 1000.0
    csoundApi.csoundScoreEvent(csound, 105, scoreEvent, 11)
end
-- SECTION B.
time_ = time_ + 5.0
-- FenderRhodesModel, FMWaterBell, Xing, ModerateFM
arrangement = {2, 4, 9, 7}
chord = chord:Q(5, modality)
velocity = 60.0
d_velocity = 0.0
dd_velocity = 0.00007
inc = 3.98972
interval = 1.0 / 12.0
duration = 9 * interval
iterations = 800
i = 0
while i < iterations do
    i = i + 1
    if i % 60 == 0 then
        chord = chord:T(-1)
        chord = chord:K()
    end
    y1 = inc * y * (1 - y)
    y = y1
    scoreEvent[0] = arrangement[1 + (i % 4)]
    scoreEvent[1] = time_
    time_ = time_ + interval
    scoreEvent[2] = duration
    local key = math.floor(36 + y1 * 60)
    scoreEvent[3] = ChordSpace.conformPitchToChord(key, chord)
    scoreEvent[4] = velocity
    velocity = velocity + d_velocity
    d_velocity = d_velocity + dd_velocity
    scoreEvent[6] = math.random(-1000, 1000) / 1000.0
    csoundApi.csoundScoreEvent(csound, 105, scoreEvent, 11)
end
-- SECTION C.
time_ = time_ + 2.0
-- Harpsichord, Guitar, Harpsichord, Guitar
local arrangement = {6, 5, 6, 5}
chord = chord:Q(-5, modality)
velocity = 66.0
d_velocity = -0.02
dd_velocity = 0.00008
inc = 3.99456
interval = 1.0 / 6.0
duration = 12 * interval
iterations = 250
i = 0
while i < iterations do
    i = i + 1
    if i % 15 == 0 then
        chord = chord:Q(2, modality)
    end
    if i % 60 == 0 then
        chord = chord:K()
    end
    y1 = inc * y * (1 - y)
    y = y1
    scoreEvent[0] = arrangement[1 + (i % 4)]
    scoreEvent[1] = time_
    time_ = time_ + interval
    scoreEvent[2] = duration
    local key = math.floor(36 + y1 * 48)
    scoreEvent[3] = ChordSpace.conformPitchToChord(key, chord)
    scoreEvent[4] = velocity
    velocity = velocity + d_velocity
    d_velocity = d_velocity + dd_velocity
    scoreEvent[6] = math.random(-1000, 1000) / 1000.0
    csoundApi.csoundScoreEvent(csound, 105, scoreEvent, 11)
end

}}

iampdbfs                        init                    32768
                                prints                  "Default amplitude at 0 dBFS:  %9.4f\n", iampdbfs
idbafs                          init                    dbamp(iampdbfs)
                                prints                  "dbA at 0 dBFS:                 %9.4f\n", idbafs
iheadroom                       init                    6
                                prints                  "Headroom (dB):                 %9.4f\n", iheadroom
idbaheadroom                    init                    idbafs - iheadroom
                                prints                  "dbA at headroom:               %9.4f\n", idbaheadroom
iampheadroom                    init                    ampdb(idbaheadroom)
                                prints                  "Amplitude at headroom:        %9.4f\n", iampheadroom
                                prints                  "Balance so the overall amps at the end of performance -6 dbfs.\n"

giSliderStyle                   =                       5
ivaluatorwidth                  =                       120
iwidgetheight                   =                       20
idisplaywidth                   =                       80
iguibox                         =                       2
iguioffset                      =                       3
iwidgetoffset                   =                       16
ipanelwidth                     =                       600
ipanelheight                    =                       500
                                FLpanel                 "Csound", ipanelwidth, ipanelheight, 10, 10, iguibox, 0, 1
itabswidth                      =                       ipanelwidth - (2 * iguioffset)
itabsheight                     =                       ipanelheight - (2 * iguioffset)
                                FLtabs                  itabswidth, itabsheight, iguioffset, iguioffset
itabwidth                       =                       itabswidth
itabtabheight                   =                       iwidgetheight + 2 * iguioffset
itabheight                      =                       itabsheight - itabtabheight
ifirstwidgetx                   =                       iwidgetoffset + 2 * iguioffset
ifirstwidgety                   =                       iwidgetoffset + itabtabheight + 2 * iguioffset

giFlatQ                         init                    sqrt(0.5)
giseed				            init                    0.5

gkHarpsichordGain               chnexport               "gkHarpsichordGain",            1
gkHarpsichordGain               init                    1
gkHarpsichordPan                chnexport               "gkHarpsichordPan",             1
gkHarpsichordPan                init                    0.5

                                connect                 "ChebyDrone",           "outleft", 	"Reverb",        "inleft"
                                connect                 "ChebyDrone",           "outright", "Reverb",        "inright"
                                connect                 "Compressor",           "outleft", 	"ParEq1",        "inleft"
                                connect                 "Compressor",           "outright", "ParEq1",        "inright"
                                connect                 "FenderRhodesModel",    "outleft", 	"Reverb",        "inleft"
                                connect                 "FenderRhodesModel",    "outright", "Reverb",        "inright"
                                connect                 "FilteredSines",        "outleft", 	"Reverb",        "inleft"
                                connect                 "FilteredSines",        "outright", "Reverb",        "inright"
                                connect                 "Guitar",               "outleft", 	"Reverb",        "inleft"
                                connect                 "Guitar",               "outright", "Reverb",        "inright"
                                connect                 "Harpsichord",          "outleft", 	"Reverb",        "inleft"
                                connect                 "Harpsichord",          "outright", "Reverb",        "inright"
                                connect                 "ModerateFM",          	"outleft", 	"Reverb",        "inleft"
                                connect                 "ModerateFM",          	"outright", "Reverb",        "inright"
                                connect                 "ParEq1",               "outleft", 	"ParEq2",        "inleft"
                                connect                 "ParEq1",               "outright", "ParEq2",        "inright"
                                connect                 "ParEq2",               "outleft", 	"MasterOutput",         "inleft"
                                connect                 "ParEq2",               "outright", "MasterOutput",         "inright"
                                connect                 "Reverb",               "outleft", 	"Compressor",           "inleft"
                                connect                 "Reverb",               "outright", "Compressor",           "inright"
                                connect                 "Xing",                 "outleft", 	"Reverb",        "inleft"
                                connect                 "Xing",                 "outright", "Reverb",        "inright"
                                connect                 "ZakianFlute",          "outleft", 	"Reverb",        "inleft"
                                connect                 "ZakianFlute",          "outright", "Reverb",        "inright"

                                alwayson                "Reverb"
                                alwayson                "Compressor"
                                alwayson                "ParEq1"
                      
          alwayson                "ParEq2"
                                alwayson                "MasterOutput"

                                //////////////////////////////////////////////
                                // CHEBYSHEV DRONE
                                // By Michael Gogins.
                                //////////////////////////////////////////////
                                FLgroup                 "ChebyDrone", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset , iguibox
                                ix = ifirstwidgetx
                                iy = ifirstwidgety
gkChebyDroneC1, giChebyDroneC1  FLslider                "Coefficient 1", 0, 2, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giChebyDroneC1
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkChebyDroneC2, giChebyDroneC2  FLslider                "Coefficient 2", 0, 2, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giChebyDroneC2
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkChebyDroneC3, giChebyDroneC3  FLslider                "Coefficient 3", 0, 2, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giChebyDroneC3
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkChebyDroneC4, giChebyDroneC4  FLslider                "Coefficient 4", 0, 2, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giChebyDroneC4
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkChebyDroneC5, giChebyDroneC5  FLslider                "Coefficient 5", 0, 2, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giChebyDroneC5
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkChebyDroneC6, giChebyDroneC6  FLslider                "Coefficient 6", 0, 2, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giChebyDroneC6
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkChebyDroneC7, giChebyDroneC7  FLslider                "Coefficient 7", 0, 2, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giChebyDroneC7
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkChebyDroneC8, giChebyDroneC8  FLslider                "Coefficient 8", 0, 2, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giChebyDroneC8
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkChebyDroneC9, giChebyDroneC9  FLslider                "Coefficient 9", 0, 2, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giChebyDroneC9
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkChebyDroneLevel, giChebyDroneLevel    FLslider        "Output level", 0.0001, 1000, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giChebyDroneLevel
                                FLgroupEnd
                                instr                   ChebyDrone
                                pset                    0, 0, 3600
i_instrument                    =                       p1
i_time                          =                       p2
i_duration                      =                       p3
i_midikey                       =                       p4
i_midivelocity                  =                       p5
i_phase                         =                       p6
i_pan                           =                       p7
i_depth                         =                       p8
i_height                        =                       p9
i_pitchclassset                 =                       p10
i_homogeneity                   =                       p11
ihertz                          =                       cpsmidinn(i_midikey)
iamp                            =                       ampdb(i_midivelocity) 
idampingattack                  =                       .01
idampingrelease                 =                       .02
idampingsustain                 =                       p3
iduration                       =                       idampingattack + idampingsustain + idampingrelease
p3                              =                       iduration
iattack                         init                    p3 / 4.0
idecay                          init                    p3 / 4.0
isustain                        init                    p3 / 2.0
aenvelope                       transeg                 0.0, iattack / 2.0, 2.5, iamp / 2.0, iattack / 2.0, -2.5, iamp, isustain, 0.0, iamp, idecay / 2.0, 2.5, iamp / 2.0, idecay / 2.0, -2.5, 0.
isinetable                      ftgenonce               0, 0, 65536, 10, 1, 0, .02
asignal                         poscil3                 1, ihertz, isinetable
asignal                         chebyshevpoly           asignal, 0, gkChebyDroneC1, gkChebyDroneC2, gkChebyDroneC3, gkChebyDroneC4, gkChebyDroneC5, gkChebyDroneC6, gkChebyDroneC7, gkChebyDroneC8, gkChebyDroneC9
adeclick                        linsegr                 0, idampingattack, 1, idampingsustain, 1, idampingrelease, 0
asignal                         =                       asignal * aenvelope * gkChebyDroneLevel
aoutleft, aoutright             pan2                    asignal * adeclick, i_pan
                                outleta                 "outleft", aoutleft
                                outleta                 "outright", aoutright
                                prints                  "instr %4d t %9.4f d %9.4f k %9.4f v %9.4f p %9.4f\n", p1, p2, p3, p4, p5, p7
                                endin

                                //////////////////////////////////////////////////////
                                // FenderRhodesModel
                                // Original by Perry Cook.
                                // Adapted by Michael Gogins.
                                //////////////////////////////////////////////////////
                                FLgroup                 "FenderRhodes", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset , iguibox
                                ix = ifirstwidgetx
                                iy = ifirstwidgety
gkFenderRhodesLevel, giFenderRhodesLevel    FLslider        "Output level", 0.0001, 1000, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giFenderRhodesLevel
                                FLgroupEnd
                                instr                   FenderRhodesModel
                                pset                    0, 0, 3600
i_instrument                    =                       p1
i_time                          =                       p2
i_duration                      =                       p3
i_midikey                       =                       p4
i_midivelocity                  =                       p5
i_phase                         =                       p6
i_pan                           =                       p7
i_depth                         =                       p8
i_height                        =                       p9
i_pitchclassset                 =                       p10
i_homogeneity                   =                       p11
iattack                         =                       0.01
isustain                        =                       p3
irelease                        =                       0.125
p3                              =                       isustain + iattack + irelease
adeclick                        linsegr                 0.0, iattack, 1.0, isustain, 1.0, irelease, 0.0
iindex                          =                       4
icrossfade                      =                       3
ivibedepth                      =                       0.2
iviberate                       =                       6
isine                           ftgenonce               0, 0, 65536,    10,     1
icosine                         ftgenonce               0, 0, 65536,    11,     1
icookblank                      ftgenonce               0, 0, 65536,     10,     0 ; Blank wavetable for some Cook FM opcodes.
ifn1                            =                       isine
ifn2                            =                       icosine
ifn3                            =                       isine
ifn4                            =                       icookblank
ivibefn                         =                       isine
ifrequency                      =                       cpsmidinn(i_midikey)
iamplitude                      =                       ampdb(i_midivelocity) * 6
asignal                         fmrhode                 iamplitude, ifrequency, iindex, icrossfade, ivibedepth, iviberate, ifn1, ifn2, ifn3, ifn4, ivibefn
aoutleft, aoutright		        pan2			        asignal * adeclick * gkFenderRhodesLevel, i_pan
                                outleta                 "outleft",  aoutleft
                                outleta                 "outright", aoutright
                                prints                  "instr %4d t %9.4f d %9.4f k %9.4f v %9.4f p %9.4f\n", p1, p2, p3, p4, p5, p7
                     
           endin

                                //////////////////////////////////////////////////////
                                // FilteredSines
                                // Original by Michael Bergeman.
                                // Adapted by Michael Gogins.
                                //////////////////////////////////////////////////////
                                FLgroup                 "FilteredSines", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset , iguibox
                                ix = ifirstwidgetx
                                iy = ifirstwidgety
gkFilteredSinesLevel, giFilteredSinesLevel    FLslider        "Output level", 0.0001, 1000, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giFilteredSinesLevel
                                FLgroupEnd
                                instr                   FilteredSines
                                ; Original pfields
                                ; p1 p2 p3 p4 p5 p6 p7 p8 p9
                                ; ins st dur db func at dec freq1 freq2
                                pset                    0, 0, 3600
i_instrument                    =                       p1
i_time                          =                       p2
i_duration                      =                       p3
i_midikey                       =                       p4
i_midivelocity                  =                       p5
i_phase                         =                       p6
i_pan                           =                       p7
i_depth                         =                       p8
i_height                        =                       p9
i_pitchclassset                 =                       p10
i_homogeneity                   =                       p11
iattack                         =                       0.03
isustain                        =                       p3
irelease                        =                       0.52
p3                              =                       p3 + iattack + irelease
i_duration                      =                       p3
adeclick                        linsegr                  0.0, iattack, 1.0, isustain, 1.0, irelease, 0.0
ip4                             =                       i_midivelocity
idb                             =                       ampdb(i_midivelocity) * 4
ibergeman                       ftgenonce               0, 0, 65536,     10,     0.28, 1, 0.74, 0.66, 0.78, 0.48, 0.05, 0.33, 0.12, 0.08, 0.01, 0.54, 0.19, 0.08, 0.05, 0.16, 0.01, 0.11, 0.3, 0.02, 0.2 ; Bergeman f1
ip5                             =                       ibergeman
ip3                             =                       i_duration
ip6                             =                       i_duration * 0.25
ip7                             =                       i_duration * 0.75
ip8                             =                       cpsmidinn(i_midikey - 0.01)
ip9                             =                       cpsmidinn(i_midikey + 0.01)
isc                             =                       idb * 0.333
k1                              line                    40, p3, 800
k2                              line                    440, p3, 220
k3                              linen                   isc, ip6, p3, ip7
k4                              line                    800, ip3, 40
k5                              line                    220, ip3, 440
k6                              linen                   isc, ip6, ip3, ip7
k7                              linen                   1, ip6, ip3, ip7
a5                              oscili                  k3, ip8, ip5
a6                              oscili                  k3, ip8 * 0.999, ip5
a7                              oscili                  k3, ip8 * 1.001, ip5
a1                              =                       a5 + a6 + a7
a8                              oscili                  k6, ip9, ip5
a9                              oscili                  k6, ip9 * 0.999, ip5
a10                             oscili                  k6, ip9 * 1.001, ip5
a11                             =                       a8 + a9 + a10
a2                              butterbp                a1, k1, 40
a3                              butterbp                a2, k5, k2 * 0.8
a4                              balance                 a3, a1
a12                             butterbp                a11, k4, 40
a13                             butterbp                a12, k2, k5 * 0.8
a14                             balance                 a13, a11
a15                             reverb2                 a4, 5, 0.3
a16                             reverb2                 a4, 4, 0.2
                                ; Constant-power pan.
ipi                             =                       4.0 * taninv(1.0)
iradians                        =                       i_pan * ipi / 2.0
itheta                          =                       iradians / 2.0
; Translate angle in [-1, 1] to left and right gain factors.
irightgain                      =                       sqrt(2.0) / 2.0 * (cos(itheta) + sin(itheta))
ileftgain                       =                       sqrt(2.0) / 2.0 * (cos(itheta) - sin(itheta))
a17                             =                       (a15 + a4) * ileftgain * k7
a18                             =                       (a16 + a4) * irightgain * k7
aoutleft                        =                       a17 * adeclick * gkFilteredSinesLevel
aoutright                       =                       a18 * adeclick * gkFilteredSinesLevel
                                outleta                 "outleft",  aoutleft
                                outleta                 "outright", aoutright
                                prints                  "instr %4d t %9.4f d %9.4f k %9.4f v %9.4f p %9.4f\n", p1, p2, p3, p4, p5, p7
                                endin

                                //////////////////////////////////////////////
                                // FMWaterBell
                                // Original by Steven Yi.
                                // Adapted by Michael Gogins.
                                //////////////////////////////////////////////
                                FLgroup                 "FMWaterBell", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset , iguibox
                                ix = ifirstwidgetx
                                iy = ifirstwidgety
gkFMWaterBellLevel, giFMWaterBellLevel    FLslider        "Output level", 0.0001, 1000, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giFMWaterBellLevel
                                FLgroupEnd
                                instr                   FMWaterBell
                                pset                    0, 0, 3600
i_instrument                    =                       p1
i_time                          =                       p2
i_duration                      =                       p3
i_midikey                       =                       p4
i_midivelocity                  =                       p5
i_phase                         =                       p6
i_pan                           =                       p7
i_depth                         =                       p8
i_height                        =                       p9
i_pitchclassset                 =                       p10
i_homogeneity                   =                       p11
ipch                            =                       cpsmidinn(i_midikey)
iamplitude                      =                       ampdb(i_midivelocity) * 2.0
ipch2                           =                       ipch
kpchline 	                    line                    ipch, i_duration, ipch2
iamp 	                        =                       2
ienvType	                    =                       2
kenv 	                        init 	                0
                                if ienvType == 0 kgoto env0  ; adsr
                                if ienvType == 1 kgoto env1  ; pyramid
                                if ienvType == 2 kgoto env2  ; ramp
env0:
kenv	                        adsr	                .3, .2, .9, .5
                                kgoto                   endEnvelope
env1:
kenv 	                        linseg	                0, i_duration * .5, 1, i_duration * .5, 0
                                kgoto                   endEnvelope
env2:
kenv	                        linseg 	                0, i_duration - .1, 1, .1, 0
kgoto                           endEnvelope
endEnvelope:
kc1                             =                       5
kc2                             =                       5
kvdepth                         =                       0.005
kvrate                          =                       6
icosine                  	    ftgenonce               0, 0, 65536, 11, 1
ifn1                            =                       icosine
ifn2                            =                       icosine
ifn3                            =                       icosine
ifn4                            =                       icosine
ivfn                            =                       icosine
asignal                         fmbell	                iamp, kpchline, kc1, kc2, kvdepth, kvrate, ifn1, ifn2, ifn3, ifn4, ivfn
iattack                         =                       0.003
isustain                        =                       p3
irelease                        =                       0.06
p3                              =                       isustain + iattack + irelease
adeclick                        linsegr                 0.0, iattack, 1.0, isustain, 1.0, irelease, 0.0
aoutleft,
 aoutright             pan2                    iamplitude * asignal * gkFMWaterBellLevel * adeclick, i_pan
                                outleta                 "outleft",  aoutleft
                                outleta                 "outright", aoutright
                                prints                  "instr %4d t %9.4f d %9.4f k %9.4f v %9.4f p %9.4f\n", p1, p2, p3, p4, p5, p7
                                endin

                                //////////////////////////////////////////////
                                // Guitar
                                // By Michael Gogins.
                                //////////////////////////////////////////////
                                FLgroup                 "Guitar", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset , iguibox
                                ix = ifirstwidgetx
                                iy = ifirstwidgety
gkGuitarLevel, giGuitarLevel    FLslider        "Output level", 0.0001, 1000, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giGuitarLevel
                                FLgroupEnd
                                instr                   Guitar
                                pset                    0, 0, 3600
i_instrument                    =                       p1
i_time                          =                       p2
i_duration                      =                       p3
i_midikey                       =                       p4
i_midivelocity                  =                       p5
i_phase                         =                       p6
i_pan                           =                       p7
i_depth                         =                       p8
i_height                        =                       p9
i_pitchclassset                 =                       p10
i_homogeneity                   =                       p11
ifrequency                      =                       cpsmidinn(i_midikey)
iamplitude                      =                       ampdb(i_midivelocity) / 8.0
iattack                         =                       0.01
isustain                        =                       p3
irelease                        =                       0.05
p3                              =                       isustain + iattack + irelease
adeclick                        linsegr                 0.0, iattack, 1.0, isustain, 1.0, irelease, 0.0
ifrequency                      =                       cpsmidinn(p4)
iamplitude                      =                       ampdb(p5) * 20
kamp                            linsegr                 0.0, iattack, iamplitude, isustain, iamplitude, irelease, 0.0
asigcomp                        pluck                   1, 440, 440, 0, 1
asig                            pluck                   1, ifrequency, ifrequency, 0, 1
af1                             reson                   asig, 110, 80
af2                             reson                   asig, 220, 100
af3                             reson                   asig, 440, 80
aout                            balance                 0.6 * af1+ af2 + 0.6 * af3 + 0.4 * asig, asigcomp
kexp                            expseg                  1.0, iattack, 2.0, isustain, 1.0, irelease, 1.0
kenv                            =                       kexp - 1.0
asignal                         =                       aout * kenv * kamp
aoutleft, aoutright             pan2                    asignal * adeclick * gkGuitarLevel, i_pan
                                outleta                 "outleft",  aoutleft
                                outleta                 "outright", aoutright
                                prints                  "instr %4d t %9.4f d %9.4f k %9.4f v %9.4f p %9.4f\n", p1, p2, p3, p4, p5, p7
                                endin

                                //////////////////////////////////////////////
                                // Original by James Kelley.
                                // Adapted by Michael Gogins.
                                //////////////////////////////////////////////
                                FLgroup                 "Harpsichord", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset , iguibox
                                ix = ifirstwidgetx
                                iy = ifirstwidgety
gkHarpsichordLevel, giHarpsichordLevel    FLslider        "Output level", 0.0001, 1000, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giHarpsichordLevel
                                FLgroupEnd
                                instr 			        Harpsichord
insno           		        =                       p1
itime           		        =                       p2
iduration       		        =                       p3
ikey            		        =                       p4
ivelocity                       =                       p5
iphase                          =                       p6
ipan                            =                       p7
idepth                          =                       p8
iheight                         =                       p9
ipcs                            =                       p10
ihomogeneity                    =                       p11
gkHarpsichordGain               =                       .25
gkHarpsichordPan                =                       .5
iattack                         =                       .005
isustain                        =                       p3
irelease                        =                       .3
p3                              =                       iattack + isustain + irelease
iHz                             =                       cpsmidinn(ikey)
kHz                             =                       k(iHz)
iamplitude                      =                       ampdb(ivelocity) * 36
aenvelope               	    transeg                 1.0, 20.0, -10.0, 0.05
apluck                  	    pluck                   1, kHz, iHz, 0, 1
iharptable              	    ftgenonce               0, 0, 65536,  7, -1, 1024, 1, 1024, -1
aharp                   	    poscil                  1, kHz, iharptable
aharp2                  	    balance                 apluck, aharp
asignal			                =                       (apluck + aharp2) * iamplitude * aenvelope * gkHarpsichordGain
adeclick                        linsegr                 0, iattack, 1, isustain, 1, irelease, 0
aoutleft, aoutright             pan2                    asignal * adeclick * gkHarpsichordLevel, ipan
                                outleta                 "outleft",  aoutleft
                                outleta                 "outright", aoutright
                                prints                  "instr %4d t %9.4f d %9.4f k %9.4f v %9.4f p %9.4f\n", p1, p2, p3, p4, p5, p7
                                endin

                                //////////////////////////////////////////////
                                // ModerateFM
                                // By Michael Gogins.
                                //////////////////////////////////////////////
                                FLgroup                 "ModerateFM", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset , iguibox
                                ix = ifirstwidgetx
                                iy = ifirstwidgety
gkModerateFMCarrier, giModerateFMCarrier    FLslider    "Carrier", 0.5, 2, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1.0, giModerateFMCarrier
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkModerateFMModulator, giModerateFMModulator    FLslider "Modulator", 0.0, 10.0, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              0.5, giModerateFMModulator
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkModerateFMIndex, giModerateFMIndex    FLslider        "Index", 0.0, 10.0, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              0.25, giModerateFMIndex
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkModerateFMAmplitude, giModerateFMAmplitude    FLslider "FM amplitude", 0.0, 10.0, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              0.25, giModerateFMAmplitude
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkModerateFMLevel, giModerateFMLevel    FLslider        "Output level", 0.0001, 1000, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giModerateFMLevel
                                FLgroupEnd
                                instr			        ModerateFM
                                pset                    0, 0, 1000
i_instrument                    =                       p1
i_time                          =                       p2
i_duration                      =                       p3
i_midikey                       =                       p4
i_midivelocity                  =                       p5
i_phase                         =                       p6
i_pan                           =                       p7
i_depth                         =                       p8
i_height                        =                       p9
i_pitchclassset                 =                       p10
i_homogeneity                   =                       p11
iattack			                =			            0.002
isustain		                =			            p3
idecay				
            =			            8
irelease		                =			            0.05
iHz                             =                       cpsmidinn(i_midikey)
idB                             =                       i_midivelocity
iamplitude                      =                       ampdb(idB) * 4.0
ifrequencyb             	    =                       iHz * 1.003
kcarrierb               	    =                       gkModerateFMCarrier * 1.004
aindenv                 	    transeg                 0.0, iattack, -11.0, 1.0, idecay, -7.0, 0.025, isustain, 0.0, 0.025, irelease, -17.0, 0.0
aindex                  	    =                       aindenv * gkModerateFMIndex * gkModerateFMAmplitude
kindex                          downsamp                aindex, ksmps
isinetable                      ftgenonce               0, 0, 65536, 10, 1, 0, .02
aouta                   	    foscili                 1.0, iHz, gkModerateFMCarrier, gkModerateFMModulator, kindex / 4., isinetable
aoutb                   	    foscili                 1.0, ifrequencyb, kcarrierb, gkModerateFMModulator, kindex, isinetable
asignal               		    =                       (aouta + aoutb) * aindenv
adeclick                        linsegr                 0, iattack, 1, isustain, 1, irelease, 0
asignal                         =                       asignal * iamplitude * gkModerateFMLevel
aoutleft, aoutright             pan2                    asignal * adeclick, i_pan
                                outleta                 "outleft",  aoutleft
                                outleta                 "outright", aoutright
                                prints                  "instr %4d t %9.4f d %9.4f k %9.4f v %9.4f p %9.4f\n", p1, p2, p3, p4, p5, p7
                                endin

                                //////////////////////////////////////////////////////
                                // PlainPluckedString
                                // By Michael Gogins.
                                //////////////////////////////////////////////////////
                                FLgroup                 "PlainPluckedString", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset , iguibox
                                ix = ifirstwidgetx
                                iy = ifirstwidgety
gkPlainPluckedStringLevel, giPlainPluckedStringLevel    FLslider        "Output level", 0.0001, 1000, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giPlainPluckedStringLevel
                                FLgroupEnd
                                instr                   PlainPluckedString
                                pset                    0, 0, 3600
i_instrument                    =                       p1
i_time                          =                       p2
i_duration                      =                       p3
i_midikey                       =                       p4
i_midivelocity                  =                       p5
i_phase                         =                       p6
i_pan                           =                       p7
i_depth                         =                       p8
i_height                        =                       p9
i_pitchclassset                 =                       p10
i_homogeneity                   =                       p11
iattack                         =                       0.002
isustain                        =                       p3
irelease                        =                       0.075
p3                              =                       isustain + iattack + irelease
adeclick                        linsegr                 0.0, iattack, 1.0, isustain, 1.0, irelease, 0.0
ifrequency                      =                       cpsmidinn(i_midikey)
iamplitude                      =                       ampdb(i_midivelocity) * 6
aenvelope                       transeg                 0, iattack, -4, iamplitude,  isustain, -4, iamplitude / 10.0, irelease, -4, 0
asignal1                        pluck                   1, ifrequency, ifrequency * 1.002, 0, 1
asignal2                        pluck                   1, ifrequency * 1.003, ifrequency, 0, 1
asignal                         =                       (asignal1 + asignal2) * aenvelope * gkPlainPluckedStringLevel
aoutleft, aoutright		        pan2			        asignal * adeclick, i_pan
                                outleta                 "outleft",  aoutleft
                                outleta                 "outright", aoutright
                                prints                  "instr %4d t %9.4f d %9.4f k %9.4f v %9.4f p %9.4f\n", p1, p2, p3, p4, p5, p7
                                endin

                                //////////////////////////////////////////////
                                // Original by Andrew Horner.
                                // Adapted by Michael Gogins.
                                // p4 pitch in octave.pch
                                // original pitch        = A6
                                // range                 = C6 - C7
                                // extended range        = F4 - C7
                                //////////////////////////////////////////////
                                FLgroup                 "Xing", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset , iguibox
                                ix = ifirstwidgetx
                                iy = ifirstwidgety
gkXingLevel, giXingLevel    FLslider        "Output level", 0.0001, 1000, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giXingLevel
                                FLgroupEnd
                                instr                   Xing
insno           		        =                       p1
itime           		        =                       p2
iduration       		        =                       p3
ikey            		        =                       p4
ivelocity                       =                       p5
iphase                          =                       p6
ipan                            =                       p7
idepth                          =                       p8
iheight                         =                       p9
ipcs                            =                       p10
ihomogeneity                    =                       p11
kgain			    	=                       1.25
iHz                             =                       cpsmidinn(ikey)
kHz                             =                       k(iHz)
iattack                         =                       (440.0 / iHz) * 0.01
isustain                        =                       p3
irelease                        =                       .3
p3                              =                       iattack + isustain + irelease
iduration                       =                       p3
iamplitude                      =                       ampdb(ivelocity) * 8.
isine                           ftgenonce               0, 0, 65536,    10,     1
kfreq                           =                       cpsmidinn(ikey)
iamp                            =                       1
inorm                           =                       32310
aamp1                           linseg                  0,.001,5200,.001,800,.001,3000,.0025,1100,.002,2800,.0015,1500,.001,2100,.011,1600,.03,1400,.95,700,1,320,1,180,1,90,1,40,1,20,1,12,1,6,1,3,1,0,1,0
adevamp1                        linseg                  0, .05, .3, iduration - .05, 0
adev1                           poscil                  adevamp1, 6.7, isine, .8
amp1                            =                       aamp1 * (1 + adev1)
aamp2                           linseg                  0,.0009,22000,.0005,7300,.0009,11000,.0004,5500,.0006,15000,.0004,5500,.0008,2200,.055,7300,.02,8500,.38,5000,.5,300,.5,73,.5,5.,5,0,1,1
adevamp2                        linseg                  0,.12,.5,iduration-.12,0
adev2                           poscil                  adevamp2, 10.5, isine, 0
amp2                            =                       aamp2 * (1 + adev2)
aamp3                           linseg                  0,.001,3000,.001,1000,.0017,12000,.0013,3700,.001,12500,.0018,3000,.0012,1200,.001,1400,.0017,6000,.0023,200,.001,3000,.001,1200,.0015,8000,.001,1800,.0015,6000,.08,1200,.2,200,.2,40,.2,10,.4,0,1,0
adevamp3                        linseg                  0, .02, .8, iduration - .02, 0
adev3                           poscil                  adevamp3, 70, isine ,0
amp3                            =                       aamp3 * (1 + adev3)
awt1                            poscil                  amp1, kfreq, isine
awt2                            poscil                  amp2, 2.7 * kfreq, isine
awt3                            poscil                  amp3, 4.95 * kfreq, isine
asig                            =                       awt1 + awt2 + awt3
arel                            linenr                  1,0, iduration, .06
; asignal                         =                       asig * arel * (iamp / inorm) * iamplitude * kgain
asignal                         =                       asig * (iamp / inorm) * iamplitude * kgain
adeclick                        linsegr                 0, iattack, 1, isustain, 1, irelease, 0
asignal                         =                       asignal * gkXingLevel
aoutleft, aoutright		        pan2			        asignal * adeclick, .875;ipan
                                outleta                 "outleft",  aoutleft
                                outleta                 "outright", aoutright
                                prints                  "instr %4d t %9.4f d %9.4f k %9.4f v %9.4f p %9.4f\n", p1, p2, p3, p4, p5, p7
                                endin


                                //////////////////////////////////////////////
                                // ZakianFlute
                                // Original by Lee Zakian.
                                // Adapted by Michael Gogins.
                                //////////////////////////////////////////////
                                FLgroup                 "ZakianFlute", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset , iguibox
                                ix = ifirstwidgetx
                                iy = ifirstwidgety
gkZakianFlute, giZakianFlute    FLslider        "Output level", 0.0001, 1000, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giZakianFlute
                                FLgroupEnd
                                instr			        ZakianFlute
if1                    		    ftgenonce               0, 0, 65536,    10,     1
iwtsin				            init			        if1
if2                    		    ftgenonce               0, 0, 16,       -2,     40, 40, 80, 160, 320, 640, 1280, 2560, 5120, 10240, 10240
if26                   		    ftgenonce               0, 0, 65536,    -10,    2000, 489, 74, 219, 125, 9, 33, 5, 5
if27                   		    ftgenonce               0, 0, 65536,    -10,    2729, 1926, 346, 662, 537, 110, 61, 29, 7
if28                   		    ftgenonce               0, 0, 65536,    -10,    2558, 2012, 390, 361, 534, 139, 53, 22, 10, 13, 10
if29                   		    ftgenonce               0, 0, 65536,    -10,    12318, 8844, 1841, 1636, 256, 150, 60, 46, 11
if30                   		    ftgenonce               0, 0, 65536,    -10,    1229, 16, 34, 57, 32
if31                   		    ftgenonce               0, 0, 65536,    -10,    163, 31, 1, 50, 31
if32                   		    ftgenonce               0, 0, 65536,    -10,    4128, 883, 354, 79, 59, 23
if33                   		    ftgenonce               0, 0, 65536,    -10,    1924, 930, 251, 50, 25, 14
if34                   		    ftgenonce               0, 0, 65536,    -10,    94, 6, 22, 8
if35                   		    ftgenonce               0, 0, 65536,    -10,    2661, 87, 33, 18
if36                   		    ftgenonce               0, 0, 65536,    -10,    174, 12
if37                   		    ftgenonce               0, 0, 65536,    -10,    314, 13
                                pset                    0, 0, 3600
i_instrument                    =                       p1
i_time                          =                       p2
i_duration                      =                       p3
i_midikey                       =                       p4
i_midivelocity                  =                       p5
i_phase                         =                       p6
i_pan                           =                       p7
i_depth                         =                       p8
i_height                        =                       p9
i_pitchclassset                 =                       p10
i_homogeneity                   =                       p11
ifrequency                      =                       cpsmidinn(i_midikey)
iamplitude                      =                       ampdb(i_midivelocity) * 4
iattack                         =                       .25
isustain                        =                       p3
irelease                        =                       .33333333
p3                              =                       iattack + isustain + irelease
iHz                             =                       ifrequency
kHz                             =                       k(iHz)
idB                             =                       i_midivelocity
adeclick77                        linsegr                 0, iattack, 1, isustain, 1, irelease, 0
ip3                     	    =                       (p3 < 3.0 ? p3 : 3.0)
; parameters
; p4    overall amplitude scaling factor
ip4                     	    init                    iamplitude
; p5    pitch in Hertz (normal pitch range: C4-C7)
ip5                     	    init                    iHz
; p6    percent vibrato depth, recommended values in range [-1., +1.]
ip6                     	    init                    1
;        0.0    -> no vibrato
;       +1.     -> 1% vibrato depth, where vibrato rate increases slightly
;       -1.     -> 1% vibrato depth, where vibrato rate decreases slightly
; p7    attack time in seconds
;       recommended value:  .12 for slurred notes, .06 for tongued notes
;                            (.03 for short notes)
ip7                     	    init                    .08
; p8    decay time in seconds
;       recommended value:  .1 (.05 for short notes)
ip8                     	    init                    .08
; p9    overall brightness / filter cutoff factor
;       1 -> least bright / minimum filter cutoff frequency (40 Hz)
;       9 -> brightest / maximum filter cutoff frequency (10,240Hz)
ip9                     	    init                    5
; initial variables
iampscale               	    =                       ip4                              ; overall amplitude scaling factor
ifreq                   	    =                       ip5                              ; pitch in Hertz
ivibdepth               	    =                       abs(ip6*ifreq/100.0)             ; vibrato depth relative to fundamental frequency
iattack                 	    =                       ip7 * (1.1 - .2*giseed)          ; attack time with up to +-10% random deviation
giseed                  	    =                       frac(giseed*105.947)             ; reset giseed
idecay                  	    =                       ip8 * (1.1 - .2*giseed)          ; decay time with up to +-10% random deviation
giseed                  	    =                       frac(giseed*105.947)
ifiltcut                	    tablei                  ip9, if2                          ; lowpass filter cutoff frequency
iattack                 	    =                       (iattack < 6/kr ? 6/kr : iattack)               ; minimal attack length
idecay                  	    =                       (idecay < 6/kr ? 6/kr : idecay)                 ; minimal decay length
isustain                	    =                       p3 - iattack - idecay
p3                      	    =                       (isustain < 5/kr ? iattack+idecay+5/kr : p3)    ; minimal sustain length
isustain                	    =                       (isustain < 5/kr ? 5/kr : isustain)
iatt                    	    =                       iattack/6
isus                    	    =                       isustain/4
idec                    	    =                       idecay/6
iphase                  	    =                       giseed                          ; use same phase for all wavetables
giseed                  	    =                       frac(giseed*105.947)
; vibrato block
; kvibdepth               	    linseg                  .1, .8*p3, 1, .2*p3, .7
kvibdepth               	    linseg                  .1, .8*ip3, 1, isustain, 1, .2*ip3, .7
kvibdepth               	    =                       kvibdepth* ivibdepth            ; vibrato depth
kvibdepthr              	    randi                   .1*kvibdepth, 5, giseed         ; up to 10% vibrato depth variation
giseed                  	    =                       frac(giseed*105.947)
kvibdepth               	    =                       kvibdepth + kvibdepthr
ivibr1                  	    =                       giseed                          ; vibrato rate
giseed                  	    =                       frac(giseed*105.947)
ivibr2                  	    =                       giseed
giseed                  	    =                       frac(giseed*105.947)

                                if                      ip6 < 0 goto            vibrato1
kvibrate                	    linseg                  2.5+ivibr1, p3, 4.5+ivibr2      ; if p6 positive vibrato gets faster
                                goto                    vibrato2
vibrato1:
ivibr3                  	    =                       giseed
giseed                  	    =                       frac(giseed*105.947)
kvibrate                	    linseg                  3.5+ivibr1, .1, 4.5+ivibr2, p3-.1, 2.5+ivibr3   ; if p6 negative vibrato gets slower
vibrato2:
kvibrater               	    randi                   .1*kvibrate, 5, giseed          ; up to 10% vibrato rate variation
giseed                  	    =                       frac(giseed*105.947)
kvibrate                	    =                       kvibrate + kvibrater
kvib                    	    oscili                  kvibdepth, kvibrate, iwtsin
ifdev1                  	    =                       -.03 * giseed                           ; frequency deviation
giseed                  	    =                       frac(giseed*105.947)
ifdev2                  	    =                       .003 * giseed
giseed                  	    =                       frac(giseed*105.947)
ifdev3                  	    =                       -.0015 * giseed
giseed                  	    =                       frac(giseed*105.947)
ifdev4                  	    =                       .012 * giseed
giseed                  	    =                       frac(giseed*105.947)
kfreqr                  	    linseg                  ifdev1, iattack, ifdev2, isustain, ifdev3, idecay, ifdev4
kfreq                   	    =                       kHz * (1 + kfreqr) + kvib
                                if                      ifreq <  427.28 goto    range1                          ; (cpspch(8.08) + cpspch(8.09))/2
                                if                      ifreq <  608.22 goto    range2                          ; (cpspch(9.02) + cpspch(9.03))/2
                                if                      ifreq <  1013.7 goto    range3                          ; (cpspch(9.11)
 + cpspch(10.00))/2
                                goto                    range4
; wavetable amplitude envelopes
range1:                 	    ; for low range tones
kamp1                   	    linseg                  0, iatt, 0.002, iatt, 0.045, iatt, 0.146, iatt,  \
                                                        0.272, iatt, 0.072, iatt, 0.043, isus, 0.230, isus, 0.000, isus, \
                                                        0.118, isus, 0.923, idec, 1.191, idec, 0.794, idec, 0.418, idec, \
                                                        0.172, idec, 0.053, idec, 0
kamp2                   	    linseg                  0, iatt, 0.009, iatt, 0.022, iatt, -0.049, iatt,  \
                                                        -0.120, iatt, 0.297, iatt, 1.890, isus, 1.543, isus, 0.000, isus, \
                                                        0.546, isus, 0.690, idec, -0.318, idec, -0.326, idec, -0.116, idec, \
                                                        -0.035, idec, -0.020, idec, 0
kamp3                   	    linseg                  0, iatt, 0.005, iatt, -0.026, iatt, 0.023, iatt,    \
                                                        0.133, iatt, 0.060, iatt, -1.245, isus, -0.760, isus, 1.000, isus,  \
                                                        0.360, isus, -0.526, idec, 0.165, idec, 0.184, idec, 0.060, idec,   \
                                                        0.010, idec, 0.013, idec, 0
iwt1                    	    =                       if26                                      ; wavetable numbers
iwt2                    	    =                       if27
iwt3                    	    =                       if28
inorm                   	    =                       3949
                                goto                    end
range2:                 	    ; for low mid-range tones
kamp1                   	    linseg                  0, iatt, 0.000, iatt, -0.005, iatt, 0.000, iatt, \
                                                        0.030, iatt, 0.198, iatt, 0.664, isus, 1.451, isus, 1.782, isus, \
                                                        1.316, isus, 0.817, idec, 0.284, idec, 0.171, idec, 0.082, idec, \
                                                        0.037, idec, 0.012, idec, 0
kamp2                   	    linseg                  0, iatt, 0.000, iatt, 0.320, iatt, 0.882, iatt,      \
                                                        1.863, iatt, 4.175, iatt, 4.355, isus, -5.329, isus, -8.303, isus,   \
                                                        -1.480, isus, -0.472, idec, 1.819, idec, -0.135, idec, -0.082, idec, \
                                                        -0.170, idec, -0.065, idec, 0
kamp3                   	    linseg                  0, iatt, 1.000, iatt, 0.520, iatt, -0.303, iatt,     \
                                                        0.059, iatt, -4.103, iatt, -6.784, isus, 7.006, isus, 11, isus,      \
                                                        12.495, isus, -0.562, idec, -4.946, idec, -0.587, idec, 0.440, idec, \
                                                        0.174, idec, -0.027, idec, 0
iwt1                    	    =                       if29
iwt2                    	    =                       if30
iwt3                    	    =                       if31
inorm                   	    =                       27668.2
                                goto                    end
range3:                 	    ; for high mid-range tones
kamp1                   	    linseg                  0, iatt, 0.005, iatt, 0.000, iatt, -0.082, iatt,      \
                                                        0.36, iatt, 0.581, iatt, 0.416, isus, 1.073, isus, 0.000, isus,       \
                                                        0.356, isus, .86, idec, 0.532, idec, 0.162, idec, 0.076, idec, 0.064, \
                                                        idec, 0.031, idec, 0
kamp2                   	    linseg                  0, iatt, -0.005, iatt, 0.000, iatt, 0.205, iatt,      \
                                                        -0.284, iatt, -0.208, iatt, 0.326, isus, -0.401, isus, 1.540, isus,   \
                                                        0.589, isus, -0.486, idec, -0.016, idec, 0.141, idec, 0.105, idec,    \
                                                        -0.003, idec, -0.023, idec, 0
kamp3                   	    linseg                  0, iatt, 0.722, iatt, 1.500, iatt, 3.697, iatt,       \
                                                        0.080, iatt, -2.327, iatt, -0.684, isus, -2.638, isus, 0.000, isus,   \
                                                        1.347, isus, 0.485, idec, -0.419, idec, -.700, idec, -0.278, idec,    \
                                                        0.167, idec, -0.059, idec, 0
iwt1                    	    =                       if32
iwt2                    	    =                       if33
iwt3                    	    =                       if34
inorm                   	    =                       3775
                                goto                    end
range4:                                                 ; for high range tones
kamp1                   	    linseg                  0, iatt, 0.000, iatt, 0.000, iatt, 0.211, iatt,         \
                                                        0.526, iatt, 0.989, iatt, 1.216, isus, 1.727, isus, 1.881, isus,        \
                                                        1.462, isus, 1.28, idec, 0.75, idec, 0.34, idec, 0.154, idec, 0.122,    \
                                                        idec, 0.028, idec, 0
kamp2                   	    linseg                  0, iatt, 0.500, iatt, 0.000, iatt, 0.181, iatt,         \
                                                        0.859, iatt, -0.205, iatt, -0.430, isus, -0.725, isus, -0.544, isus,    \
                                                        -0.436, isus, -0.109, idec, -0.03, idec, -0.022, idec, -0.046, idec,    \
                                                        -0.071, idec, -0.019, idec, 0
kamp3                   	    linseg                  0, iatt, 0.000, iatt, 1.000, iatt, 0.426, iatt,         \
                                                        0.222, iatt, 0.175, iatt, -0.153, isus, 0.355, isus, 0.175, isus,       \
                                                        0.16, isus, -0.246, idec, -0.045, idec, -0.072, idec, 0.057, idec,      \
                                                        -0.024, idec, 0.002, idec, 0
iwt1                    	    =                       if35
iwt2                    	    =                       if36
iwt3                    	    =                       if37
inorm                   	    =                       4909.05
                                goto                    end
end:
kampr1                  	    randi                   .02*kamp1, 10, giseed                   ; up to 2% wavetable amplitude variation
giseed                  	    =                       frac(giseed*105.947)
kamp1                   	    =                       kamp1 + kampr1
kampr2                  	    randi                   .02*kamp2, 10, giseed                   ; up to 2% wavetable amplitude variation
giseed                  	    =                       frac(giseed*105.947)
kamp2                   	    =                       kamp2 + kampr2
kampr3                  	    randi                   .02*kamp3, 10, giseed                   ; up to 2% wavetable amplitude variation
giseed                  	    =                       frac(giseed*105.947)
kamp3                   	    =                       kamp3 + kampr3
awt1                    	    poscil                  kamp1, kfreq, iwt1, iphase              ; wavetable lookup
awt2                    	    poscil                  kamp2, kfreq, iwt2, iphase
awt3                    	    poscil                  kamp3, kfreq, iwt3, iphase
asig                    	    =                       awt1 + awt2 + awt3
asig                    	    =                       asig*(iampscale/inorm)
kcut                    	    linseg                  0, iattack, ifiltcut, isustain, ifiltcut, idecay, 0     ; lowpass filter for brightness control
afilt                   	    tone                    asig, kcut
asignal                    	    balance                 afilt, asig
iattack                         =                       0.005
isustain                        =                       p3
irelease                        =                       0.06
p3                              =                       isustain + iattack + irelease
adeclick                        linsegr                 0.0, iattack, 1.0, isustain, 1.0, irelease, 0.0
aoutleft, aoutright             pan2                    asignal * adeclick * gkZakianFlute, i_pan
                                outleta                 "outleft",  aoutleft
                                outleta                 "outright", aoutright
                                prints                  "instr %4d t %9.4f d %9.4f k %9.4f v %9.4f p %9.4f\n", p1, p2, p3, p4, p5, p7
                                endin

                                //////////////////////////////////////////////
                                // OUTPUT INSTRUMENTS MUST GO BELOW HERE
                                //////////////////////////////////////////////

                                //////////////////////////////////////////////
                                // Reverb
                                // By Michael Gogins.
                                //////////////////////////////////////////////
                                FLgroup                 "Reverb", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset, iguibox
       
                         ix = ifirstwidgetx
                                iy = ifirstwidgety
gkReverbEnabled, giReverbEnabled FLbutton               "Enabled", 1, 0, 3, ivaluatorwidth, iwidgetheight, ix, iy, -1
                                FLsetVal_i              0, giReverbEnabled
iy                              =                       iy + 2 * iwidgetheight + iguioffset

gkReverbWet, giReverbWet        FLslider                "Wet", 0, 1, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giReverbWet
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkReverbDelay, giReverbDelay    FLslider                "Delay", 0, 1, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giReverbDelay
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkReverbCutoff, giReverbCutoff  FLslider                "Cutoff", 20, 20000, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giReverbCutoff
                                FLgroupEnd
                                instr                   Reverb
ainleft                         inleta                  "inleft"
ainright                        inleta                  "inright"
if (gkReverbEnabled == 0) then
aoutleft                        =                       ainleft
aoutright                       =                       ainright
kdry				            =			            1.0 - gkReverbWet
else
awetleft, awetright             reverbsc                ainleft, ainright, gkReverbDelay, gkReverbCutoff
aoutleft			            =			            ainleft *  kdry + awetleft  * gkReverbWet
aoutright			            =			            ainright * kdry + awetright * gkReverbWet
endif
                                outleta                 "outleft", aoutleft
                                outleta                 "outright", aoutright
                                endin

                                //////////////////////////////////////////////
                                // Compressor
                                // By Michael Gogins.
                                //////////////////////////////////////////////
                                FLgroup                 "Compressor", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset , iguibox
                                ix = ifirstwidgetx
                                iy = ifirstwidgety
gkCompressorEnabled, giCompressorEnabled    FLbutton                "Enabled", 1, 0, 3, ivaluatorwidth, iwidgetheight, ix, iy, -1
                                FLsetVal_i              0, giCompressorEnabled
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkCompressorThreshold, giCompressorThreshold  FLslider  "Threshhold", 0.000001, 1, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giCompressorThreshold
iy                              =                       iy + 2 * iwidgetheight + iguioffset

gkCompressorLowKnee, giCompressorLowKnee  FLslider      "Low knee", 0.000001, 100, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giCompressorLowKnee
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkCompressorHighKnee, giCompressorHighKnee  FLslider    "High knee", 0.000001, 100, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giCompressorHighKnee
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkCompressorRatio, giCompressorRatio  FLslider          "Ratio", 0.000001, 100, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giCompressorRatio
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkCompressorAttack, giCompressorAttack  FLslider        "Attack", 0.000001, 0.1, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giCompressorAttack
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkCompressorRelease, giCompressorRelease  FLslider      "Release", 0.000001, 0.1, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giCompressorRelease
                                FLgroupEnd
                                instr                   Compressor
ainleft                         inleta                  "inleft"
ainright                        inleta                  "inright"
                                if (gkCompressorEnabled == 0) then
aoutleft                        =                       ainleft
aoutright                       =                       ainright
                                else
aoutleft                        compress                ainleft,        ainleft,  gkCompressorThreshold, gkCompressorLowKnee, gkCompressorHighKnee, gkCompressorRatio, gkCompressorAttack, gkCompressorRelease, .05
aoutright                       compress                ainright,       ainright, gkCompressorThreshold, gkCompressorLowKnee, gkCompressorHighKnee, gkCompressorRatio, gkCompressorAttack, gkCompressorRelease, .05
                                endif
                                outleta                 "outleft",      aoutleft
                                outleta                 "outright",     aoutright
                                endin

                                //////////////////////////////////////////////
                                // ParEq1
                                // By Michael Gogins.
                                //////////////////////////////////////////////
                                FLgroup                 "EQ 1", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset , iguibox
                                ix = ifirstwidgetx
                                iy = ifirstwidgety
gkParEq1Enabled, giParEq1Enabled    FLbutton             "Enabled", 1, 0, 3, ivaluatorwidth, iwidgetheight, ix, iy, -1
                                FLsetVal_i              0, giParEq1Enabled
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkParEq1Mode, giParEq1Mode      FLcount                 "Mode", 0, 2, 1, 0, 2, ivaluatorwidth, iwidgetheight, ix, iy, -1
                                FLsetVal_i              1, giParEq1Mode
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkParEq1Frequency, giParEq1Frequency  FLslider          "Frequency", 20, 20000, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giParEq1Frequency
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkParEq1Gain, giParEq1Gain      FLslider                "Gain", -20, 20, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              0, giParEq1Gain
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkParEq1Q, giParEq1Q            FLslider                "Q", 0, 10, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giParEq1Q
                                FLgroupEnd
                                instr                   ParEq1
ainleft                         inleta                  "inleft"
ainright                        inleta                  "inright"
                                if (gkParEq1Enabled == 0) then
aoutleft                        =                       ainleft
aoutright                       =                       ainright
                                else
kamplitude                      =                       ampdb(gkParEq1Gain)
                                if      (gkParEq1Mode == 0) then
aoutleft                        pareq                   ainleft,        gkParEq1Frequency, kamplitude, giFlatQ + gkParEq1Q, 0
aoutright                       pareq                   ainright,       gkParEq1Frequency, kamplitude, giFlatQ + gkParEq1Q, 0
                                elseif  (gkParEq1Mode == 1) then
aoutleft                        pareq                   ainleft,        gkParEq1Frequency, kamplitude, giFlatQ + gkParEq1Q, 1
aoutright                       pareq                   ainright,       gkParEq1Frequency, kamplitude, giFlatQ + gkParEq1Q, 1
                                elseif  (gkParEq1Mode == 2) then
aoutleft                        pareq                   ainleft,        gkParEq1Frequency, kamplitude, giFlatQ + gkParEq1Q, 2
aoutright                       pareq                   ainright,       gkParEq1Frequency, kamplitude, giFlatQ + gkParEq1Q, 2
                                endif
                                endif
                                outleta                 "outleft",  aoutleft
                                outleta                 "outright", aoutright
                                endin

                                //////////////////////////////////////////////
                                // ParEq2
                                // By Michael Gogins.
                                //////////////////////////////////////////////
                                FLgroup                 "EQ 2", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset , iguibox
                                ix = ifirstwidgetx

                                iy = ifirstwidgety
gkParEq2Enabled, giParEq2Enabled    FLbutton             "Enabled", 1, 0, 3, ivaluatorwidth, iwidgetheight, ix, iy, -1
                                FLsetVal_i              0, giParEq2Enabled
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkParEq2Mode, giParEq2Mode      FLcount                 "Mode", 0, 2, 1, 0, 2, ivaluatorwidth, iwidgetheight, ix, iy, -1
                                FLsetVal_i              1, giParEq2Mode
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkParEq2Frequency, giParEq2Frequency  FLslider          "Frequency", 20, 20000, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giParEq2Frequency
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkParEq2Gain, giParEq2Gain      FLslider                "Gain", -20, 20, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              0, giParEq2Gain
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkParEq2Q, giParEq2Q            FLslider                "Q", 0, 10, 0, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giParEq2Q
                                FLgroupEnd
                                instr                   ParEq2
ainleft                         inleta                  "inleft"
ainright                        inleta                  "inright"
                                if                      (gkParEq2Enabled == 0) then
aoutleft                        =                       ainleft
aoutright                       =                       ainright
                                else
                                if                      (gkParEq2Mode == 0) then
aoutleft                        pareq                   ainleft, 	gkParEq2Frequency, gkParEq2Gain, giFlatQ + gkParEq2Q, 0
aoutright                       pareq                   ainright,	gkParEq2Frequency, gkParEq2Gain, giFlatQ + gkParEq2Q, 0
                                elseif                  (gkParEq2Mode == 1) then
aoutleft                        pareq                   ainleft, 	gkParEq2Frequency, gkParEq2Gain, giFlatQ + gkParEq2Q, 1
aoutright                       pareq                   ainright,	gkParEq2Frequency, gkParEq2Gain, giFlatQ + gkParEq2Q, 1
                                elseif                  (gkParEq2Mode == 2) then
aoutleft                        pareq                   ainleft, 	gkParEq2Frequency, gkParEq2Gain, giFlatQ + gkParEq2Q, 2
aoutright                       pareq                   ainright,	gkParEq2Frequency, gkParEq2Gain, giFlatQ + gkParEq2Q, 2
                                endif
                                endif
                                outleta                 "outleft", 	aoutleft
                                outleta                 "outright", aoutright
                                endin

                                //////////////////////////////////////////////
                                // MasterOutput
                                // By Michael Gogins.
                                //////////////////////////////////////////////
                                FLgroup                 "Master", itabwidth, itabheight, iguioffset, itabtabheight + iguioffset , iguibox
                                ix = ifirstwidgetx
                                iy = ifirstwidgety
gkMasterLevel, giMasterLevel    FLslider                "Output level", 0.0001, 1000, -1, giSliderStyle, -1, ivaluatorwidth, iwidgetheight, ix, iy
                                FLsetVal_i              1, giMasterLevel
iy                              =                       iy + 2 * iwidgetheight + iguioffset
                                FLsetSnapGroup          1
gkSnapSave, giSnapSave          FLbutton                "Save snapshot", 1, 0, 1, ivaluatorwidth, iwidgetheight, ix, iy, 0, 200, 0, 3
iy                              =                       iy + 2 * iwidgetheight + iguioffset
gkSnapLoad, giSnapLoad          FLbutton                "Load snapshot", 1, 0, 1, ivaluatorwidth, iwidgetheight, ix, iy, 0, 201, 0, 3
                                FLgroupEnd

                                instr                   MasterOutput
ivalid                          filevalid               gSnapshotfile
                                if ivalid == 1          then
                                prints                  "Loading..."
                                FLloadsnap              gSnapshotfile
ivaluecount                     FLgetsnap               0
                                prints                  "%d values set.\n", ivaluecount
                                else
                                prints                  "Missing or invalid snapshot file."
                                endif
ainleft                         inleta                  "inleft"
ainright                        inleta                  "inright"
aoutleft                        =                       gkMasterLevel * ainleft
aoutright                       =                       gkMasterLevel * ainright
                                outs                    aoutleft, aoutright
                                endin

                                instr                   200
                                prints                  "Saving..."
isnapshot, ivaluecount          FLsetsnap               0
                                FLsavesnap              gSnapshotfile
                                endin

                                instr                   201
ivalid                          filevalid               gSnapshotfile
                                if ivalid == 1          then
                                prints                  "Loading..."
                                FLloadsnap              gSnapshotfile
ivaluecount                     FLgetsnap               0
                                else
                                prints                  "Missing or invalid snapshot file."
                                endif
                                endin

                                FLtabsEnd
                                FLpanelEnd
                                FLrun
</CsInstruments>

<CsScore>
e 180
</CsScore>

</CsoundSynthesizer>