Creating arrays of wave formulas with BWise

Theo Verelst

Granted, it sounds a bit scienfic, but it's actually quite generally useful and quite followable. Like with the fairly quickly programmed experiments on Creating wave formulas with BWise and for window users a major part can run also via the code refered to on Wave player for formulas from BWise and Maxima on Windows XP the idea is to create

bwise graph --> tcl list --> maxima formula --> fortran --> linked C program --> sound program on Linux with jack and Alsa midi
of wave         of complete                               |---> latex   --> gif prettyprinted formula
formulas        formula

where most of these tools are automatically called by tcl, under Tk button control.

In this case it is fun to play with the BWise blocks creating the signal-determining formula, or instance sine waves as connected blocks, for instance I created this bwise graph automatically: You need the startup sources of the above pages, and bwise first, because they contain the necessary proc definitions !

#
# Make a ten input maxima formula addition block
#
proc_toblock add10 {} {} 700 100
#
# The output block which multiplies the final formula with the final volume, which has a name linked with the Run button
#
newproc {set mult11.out "((\${mult11.a})*(\${mult11.b}))"} mult11 {a b} out 40 {} {} 800 100
set mult11.b (1/10)
connect {} add10 out mult11 a
#
# First column
#
for {set i 1} {\$i < 11} {incr i} { proc_toblock sinea [list {f 440*\$i} {m 0} {a (1/\$i)}] sine\${i}_1 [expr 400] [expr 50+75*\$i] ; connect {} sine\${i}_1 out add10 i[expr \$i] }
#
# Second column
#
for {set i 1} {\$i < 11} {incr i} { proc_toblock sinea [list {f 440*\$i} {m 0} {a (1/(1000*\$i))}] sine\${i}_2 [expr 300] [expr 50+75*\$i] ; connect {} sine\${i}_2 out sine\${i}_1 m }

# Create entries with modulation formulas of first column (where v is the velocity of the keypress, [0,1])
#
toplevel .if1
for {set i 1} {\$i < 11} {incr i} { pack [entry .if1.e1\$i -textvar sine\${i}_2.a -width 16] -side top -expand 1 -fill x }
#
# Set the variables
#
for {set i 1} {\$i < 11} {incr i} { set sine\${i}_2.a "(v/(2000*\$i))" }

For Fortran interested people, this is the fortran file generated by the tcl routine after applying the Run button to the BWise graph:

subroutine sayhello(x,r,v)
double precision x,r,v
r =        (sin(2.764601535159018d+4*(v*sin(2.764601535159018d+4*x)/2.d+4+x))
1   /1.d+1+sin(2.4881413816431164d+4*(v*sin(2.4881413816431164d+4*x
2   )/1.8d+4+x))/9.d+0+sin(2.2116812281272147d+4*(v*sin(2.211681228
3   1272147d+4*x)/1.6d+4+x))/8.d+0+sin(1.9352210746113127d+4*(v*sin
4   (1.9352210746113127d+4*x)/1.3999999999999999d+4+x))/7.d+0+sin(1
5   .6587609210954105d+4*(v*sin(1.6587609210954105d+4*x)/1.2d+4+x))
6   /6.d+0+sin(1.382300767579509d+4*(v*sin(1.382300767579509d+4*x)/
7   1.d+4+x))/5.d+0+sin(1.1058406140636072d+4*(v*sin(1.105840614063
8   6072d+4*x)/8.d+3+x))/4.d+0+sin(8.293804605477053d+3*(v*sin(8.29
9   3804605477053d+3*x)/6.d+3+x))/3.d+0+sin(5.529203070318036d+3*(v
*sin(5.529203070318036d+3*x)/4.d+3+x))/2.d+0+sin(2.764601535159
;   018d+3*(v*sin(2.764601535159018d+3*x)/8.d+3+x)))/1.d+1
return
end

When you have Latex installed, use from bwise:

newimage /dev/shm/formula.gif

to see the formula.

During trying the column creation or otherwise it may be handy to delete per column, to do this for the second one:

for {set i 1} {\$i < 11} {incr i} { cbbox sine\${i}_2}
delete_selblocks

To also delete the associated variables:

foreach i [info var *sine*_2.*] {unset \$i}

Yesterday evening I also tried a real big graph, how about a hundred sine wave FM algorithm? That gives this [1 ] fortran function, and this http://www.theover.org/Bwise/Arr1/formula.gif formula (watch out, very big gif file!) and the algorithm has been turned into a succesfull executable using the aforementioned tcl scripts, except on a not so slow machine I could only have monophonic sound (1 100-oscilator voice at the time).

TV (sept 30 10)

For a musical experiment, see this wiki page ( http://www.theover.org/wiki/index.php/Chords_from_math_waves ) which will also contain pointers to code for making pop-up menus for creating math blocks automatically, and on a recent page on bwise I´ve made a "select all left" option to delete parts of graphs like above with only popup menus.

 Category Bwise