Having A Console Makes A Huge Difference To Productivity And Creativity
Up until now the productivity of Sonic
Field has been severely limited by the need to re-run a patch every
time it is edited; this make playing around with sound a very slow
process indeed. The addition of the Console processor opens up a
whole new arena of rapid sound development from Sonic Field. It also
opens up lots of possibilities for fun.
The implementation of Console
at the time of writing this is about as simple as it is possible to
be. In agile style, I got something working and will use it to find
out ways to improve it.
How It Works
At any point in a patch the Processor
Console can be used. This will start interacting with the console. It
simply reads from Standard Input. This works OK with the Eclipse
console which Sonic Field gets when run under Eclipse. The console
accepts lines of input. If a line consist of just:
%end%
then the console processor stops and
the next processor in the patch is run.
The Console accumulates a patch. Each
line of input is added to the patch. When an line consisting of :
%
and nothing else is entered, the
current accumulated patch is parsed and run. This allows for complex
patches to be either typed or pasted into the console window and then
run. The patch runs in the context (same store values) as the patch
which contained the original Console processor. However, there is a
difference.
When a patch launched from the command
line (or Eclipse) causes an error Sonic Field shuts down. Patches
entered in the Console to not cause Sonic Field to shut down in this
way. If you make a mistake in the Console Sonic Field will tell you
something about the mistake and then just start reading from Standard
Input again.
One Small Issue:
At the time of writing there is a
slight issue in that if there is a layout problem with code inside a
code block which is entered into the Console Sonic Field gets the
code block tracking system a bif stuffed up. If, after a patch layout
problem, you keep getting 'unmatched brace' errors, then enter
}
%
An Example:
Below is a slightly abridged example
form the Eclipse console of me working on a bass/rhythm line in Sonic
Field
SFPL:
[3]1 >> Sonic Field Thread Factory:
SFPL:
[3]1 >> ---------------------------
SFPL:
[3]1 >> Found CPUs: 8
SFPL:
[3]1 >> Initial Max Threads: 16
Parsing:
scripts/play/FastBass.sfpl size: 866
SFPL:
[532]1 >> Sonic Field Version 0.2 Starting Processing
SFPL:
[532]1 >> ============================================
?play
invoke
%
(
(0,2.0),
((?bt,2)*,0),
((?bt,4)*,2)
)NumericShape
!qEnv
%
?play
invoke
%
{
((?bt,4)*,?pitch)SinWave
MakeSawTooth dbs+3 Saturate Normalise !signal
(?qEnv,4)DirectRelength
!qsEnv
(?qsEnv,?qsEnv,?qsEnv,?qsEnv,?qsEnv)Concatenate
!qsEnv
(0,?signal
Length,>qsEnv)Cut !qsEnv
(?pitchEnv,4)DirectRelength
!psEnv
(?psEnv,?psEnv,?psEnv,?psEnv,?psEnv)Concatenate
!psEnv
(0,?signal
Length,>psEnv)Cut !psEnv
(>signal,?psEnv,?qsEnv)ShapedLadderLowPass
Normalise !signal
>signal
Normalise !signal
(>signal,2)Power
Normalise !signal
(>signal,?pitch,1,24)RBJPeaking
Normalise !signal Monitor
}!play
%
?play
invoke
%
"A2"
Note !pitch
?play
invoke
%
com.nerdscentral.sfpl.SFPL_RuntimeException:
Runtime Exception at key word Invoke
operand: '109.99999987361397'
at line: 0, colum 30 in Console
at
com.nerdscentral.sfpl.SFPL_Runner.Invoke(SFPL_Runner.java:103)
at
com.nerdscentral.audio.io.SF_Console.Interpret(SF_Console.java:57)
at
com.nerdscentral.sfpl.SFPL_Runner.Invoke(SFPL_Runner.java:87)
at
com.nerdscentral.sfpl.SFPL_Runner.Invoke(SFPL_Runner.java:64)
at
com.nerdscentral.sfpl.RenderRunnerImp.runParser(RenderRunnerImp.java:163)
at
com.nerdscentral.sfpl.RenderRunnerImp.render(RenderRunnerImp.java:65)
at
com.nerdscentral.sfpl.RenderRunner.main(RenderRunner.java:25)
Caused
by: com.nerdscentral.sfpl.SFPL_RuntimeException:
Failed to resolve type: class java.lang.Double
at
com.nerdscentral.sfpl.Caster.describeSFPLType(Caster.java:55)
at
com.nerdscentral.sfpl.Caster.throwConversion(Caster.java:49)
at
com.nerdscentral.sfpl.Caster.makeBunch(Caster.java:68)
at
com.nerdscentral.sfpl.SFPL_Parser$cInvoke.Interpret(SFPL_Parser.java:1166)
at
com.nerdscentral.sfpl.SFPL_Runner.Invoke(SFPL_Runner.java:87)
...
6 more
"A2"
Note !pitch
%
?play
println
%
com.nerdscentral.sfpl.SFPL_Runner@c6824d9
?play
println
%
com.nerdscentral.sfpl.SFPL_Runner@c6824d9
?play
invoke
%
{
((?bt,4)*,?pitch)SinWave
MakeSawTooth dbs+3 Saturate Normalise !signal
(?qEnv,4)DirectRelength
!qsEnv
(?qsEnv,?qsEnv,?qsEnv,?qsEnv,?qsEnv)Concatenate
!qsEnv
(0,?signal
Length,>qsEnv)Cut !qsEnv
(?pitchEnv,4)DirectRelength
!psEnv
(?psEnv,?psEnv,?psEnv,?psEnv,?psEnv)Concatenate
!psEnv
(0,?signal
Length,>psEnv)Cut !psEnv
(>signal,?psEnv,?qsEnv)ShapedLadderLowPass
Normalise !signal
>signal
Normalise !signal
(>signal,2)Power
Normalise !signal
(>signal,?pitch,1,24)RBJPeaking
Normalise dbs+3 Saturate Normalise !signal
?bt
WhiteNoise MakeTriangle Normalise !signalb
(
>signal,>signalb
)Concatenate
!signal Monitor
}!play
%
?play
invoke
%
?play
invoke
%
{
((?bt,4)*,?pitch)SinWave
MakeSawTooth dbs+3 Saturate Normalise !signal
(?qEnv,4)DirectRelength
!qsEnv
(?qsEnv,?qsEnv,?qsEnv,?qsEnv,?qsEnv)Concatenate
!qsEnv
(0,?signal
Length,>qsEnv)Cut !qsEnv
(?pitchEnv,4)DirectRelength
!psEnv
(?psEnv,?psEnv,?psEnv,?psEnv,?psEnv)Concatenate
!psEnv
(0,?signal
Length,>psEnv)Cut !psEnv
(>signal,?psEnv,?qsEnv)ShapedLadderLowPass
Normalise !signal
>signal
Normalise !signal
(>signal,2)Power
Normalise !signal
?bt
WhiteNoise MakeSawTooth !signalb
(?signalb,(?pitch,4)*,24,1.5)RBJLowShelf
!signalb
(
((0,0),(100,1),(?signalb
Length,0))NumericShape,
>signalb
)Multiply
Normalise !signalb
(
>signal,>signalb
)Concatenate
!signal
(>signal,?pitch,1,24)RBJPeaking
Normalise dbs+3 Saturate Normalise !signal Monitor
}!play
%
?play
invoke
%
{
((?bt,4)*,?pitch)SinWave
MakeSawTooth dbs+3 Saturate Normalise !signal
(?qEnv,4)DirectRelength
!qsEnv
(?qsEnv,?qsEnv,?qsEnv,?qsEnv,?qsEnv)Concatenate
!qsEnv
(0,?signal
Length,>qsEnv)Cut !qsEnv
(?pitchEnv,4)DirectRelength
!psEnv
(?psEnv,?psEnv,?psEnv,?psEnv,?psEnv)Concatenate
!psEnv
(0,?signal
Length,>psEnv)Cut !psEnv
(>signal,?psEnv,?qsEnv)ShapedLadderLowPass
Normalise !signal
>signal
Normalise !signal
(>signal,2)Power
Normalise !signal
?bt
WhiteNoise MakeSawTooth !signalb
(?signalb,(?pitch,4)*,1.5,24)RBJLowShelf
!signalb
(
((0,0),(100,1),(?signalb
Length,0))NumericShape,
>signalb
)Multiply
Normalise !signalb
(
>signal,>signalb
)Concatenate
!signal
(>signal,?pitch,1,24)RBJPeaking
Normalise dbs+3 Saturate Normalise !signal Monitor
}!play
%
?play
invoke
%
{
((?bt,4)*,?pitch)SinWave
MakeSawTooth dbs+3 Saturate Normalise !signal
(?qEnv,4)DirectRelength
!qsEnv
(?qsEnv,?qsEnv,?qsEnv,?qsEnv,?qsEnv)Concatenate
!qsEnv
(0,?signal
Length,>qsEnv)Cut !qsEnv
(?pitchEnv,4)DirectRelength
!psEnv
(?psEnv,?psEnv,?psEnv,?psEnv,?psEnv)Concatenate
!psEnv
(0,?signal
Length,>psEnv)Cut !psEnv
(>signal,?psEnv,?qsEnv)ShapedLadderLowPass
Normalise !signal
>signal
Normalise !signal
(>signal,2)Power
Normalise !signal
?bt
WhiteNoise MakeSawTooth !signalb
(?signalb,(?pitch,2)*,1.5,24)RBJLowShelf
!signalb
(
((0,0),(100,1),(?signalb
Length,0))NumericShape,
>signalb
)Multiply
Normalise !signalb
(
>signal,>signalb
dbs+12
)Concatenate
!signal
(>signal,?pitch,1,24)RBJPeaking
Normalise dbs+3 Saturate Normalise !signal Monitor
}!play
%
?play
invoke
%
?signal
monitor
%
((?signal),"temp/tone.wav")WriteFile32
%
No comments:
Post a Comment