#!/command/tclsh

load ./ntk.so

set pi_2     [expr {asin(1)  }]
set pi       [expr {$pi_2 * 2}]
set 3_pi_2   [expr {$pi_2 * 3}]
set 2_pi     [expr {$pi_2 * 4}]

 set waveform "phase() > $pi ? 1 : -1"
#set waveform "phase() / $pi - 1"
#set waveform "sin(phase())"

#set ampl_envl "sin($pi * pos())"
#set ampl_envl "cos($pi_2 * pos())"
 set ampl_envl "pos() < 0.25 ? sin($2_pi * pos())       :\
                pos() > 0.75 ? sin($2_pi * (1 - pos())) :\
                1"
#set ampl_envl "pos() < 0.02 ? pos() / 0.02 : 1 - ((pos() - 0.02) / 0.98)"
#set ampl_envl "1"

#set freq_envl {tan(pos() * $pi_2)}
#set freq_envl "1 + sin(time() * $pi * 12) * 0.02"
#set freq_envl "cos($pi_2 * pos())"
#set freq_envl "sin($pi * pos())"
#set freq_envl "pos()"
#set freq_envl "1 - pos()"
 set freq_envl "1"

proc make_note {duration frequency} {
    global waveform ampl_envl freq_envl
    return [dict create             \
        start       2.5             \
        phase       0.0             \
        duration    $duration       \
        position    0               \
        waveform    $waveform       \
        amplitude   0.2             \
        ampl_envl   $ampl_envl      \
        frequency   [expr {220 * 2 ** ($frequency / 12.)}] \
        freq_envl   $freq_envl      \
        bas 1
    ]
}

set notes(0) [make_note 0.5  3]
set notes(1) [make_note 0.5  7]
set notes(2) [make_note 0.5 10]
set notes(3) [make_note 0.5 13]
set notes(4) [make_note 0.5 15]

set chan [open |[list aplay -q -traw -c1 -r22050 -fs16_le -] w]
#set chan [open |[list oggenc -r -C 1 -R 22050 -Q -o output.ogg -] w]
#set chan [open |[list sox -traw -c1 -r22050 -s -w - output.mp3] w]
proc output {data} {global chan; puts -nonewline $chan $data}

output [ntk::mix                                                       \
[expr {int(22050 * 0.0)}] [ntk::gen [expr {int(22050 * 3.0)}] notes(0)]\
[expr {int(22050 * 0.0)}] [ntk::gen [expr {int(22050 * 3.0)}] notes(1)]\
[expr {int(22050 * 0.0)}] [ntk::gen [expr {int(22050 * 3.0)}] notes(2)]\
[expr {int(22050 * 0.0)}] [ntk::gen [expr {int(22050 * 3.0)}] notes(3)]\
[expr {int(22050 * 0.0)}] [ntk::gen [expr {int(22050 * 3.0)}] notes(4)]]

close $chan

# vim: set ts=4 sts=4 sw=4 tw=80 et:
