File: generator.plg

package info (click to toggle)
snack 2.2.10.20090623-dfsg-8
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 3,764 kB
  • sloc: ansic: 32,662; sh: 8,558; tcl: 1,086; python: 761; makefile: 582
file content (145 lines) | stat: -rw-r--r-- 4,101 bytes parent folder | download | duplicates (13)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# -*-Mode:Tcl-*-

namespace eval beepgen_v1 {
    variable generator

    lappend ::v(plugins) ::beepgen_v1
    snack::menuCommand Tools {Beep Generator} ::beepgen_v1::GenWin
    
    proc Describe {} {
	return "This plug-in adds the capability to generate simple beeps."
    }
    
    proc Unload {} {
	snack::menuDelete Tools {Beep Generator}
    }
    
    proc Redraw y {
	return 0
    }
    
    proc Putmark m {
	variable generator
	
	set generator(sta) [Marker2Sample m1]
	set generator(end) [Marker2Sample m2]
    }
    
    proc GenWin {} {
	global v
	variable generator

	set w .gen
	catch {destroy $w}
	toplevel $w
	wm title $w {Beep generator}
	wm geometry $w [xsGetGeometry]
	
	if ![info exists generator(amp)] { set generator(amp) 10000 }
	if ![info exists generator(type)] { set generator(type) sine }
	if ![info exists generator(frq)] { set generator(frq) 1000 }
	set generator(sta) [Marker2Sample m1]
	set generator(end) [Marker2Sample m2]

	pack [ frame $w.f0 ]
	pack [ label $w.f0.l -text Type] -side left
	pack [ radiobutton $w.f0.ri -text Sine -val sine -var ::beepgen_v1::generator(type)] -side left
	pack [ radiobutton $w.f0.rq -text Square -val square -var ::beepgen_v1::generator(type)] -side left
	pack [ radiobutton $w.f0.rl -text Silence -val silence -var ::beepgen_v1::generator(type) -command {set ::beepgen_v1::generator(amp) 0}] -side left

	if {[snd cget -channels] == 1} {
	    set generator(chan) ""
	    set state disabled
	} else {
	    set generator(chan) both
	    set state normal
	}

	pack [ frame $w.fs ]
	pack [ label $w.fs.lab -text Channel] -side left
	pack [ radiobutton $w.fs.b -text Both -val both -var ::beepgen_v1::generator(chan) -state $state] -side left
	pack [ radiobutton $w.fs.r -text Left -val left -var ::beepgen_v1::generator(chan) -state $state] -side left
	pack [ radiobutton $w.fs.l -text Right -val right -var ::beepgen_v1::generator(chan) -state $state] -side left
	
	pack [ frame $w.f1 ]
	pack [ label $w.f1.l -text Frequency -wi 12] -side left
	pack [ entry $w.f1.e -textvar ::beepgen_v1::generator(frq) -wi 7 ] -side left
	
	pack [ frame $w.f2 ]
	pack [ label $w.f2.l -text Amplitude -wi 12] -side left
	pack [ entry $w.f2.e -textvar ::beepgen_v1::generator(amp) -wi 7 ] -side left
	
	pack [ frame $w.f3 ]
	pack [ label $w.f3.l -text "Start sample" -wi 12] -side left
	pack [ entry $w.f3.e -textvar ::beepgen_v1::generator(sta) -wi 7 ] -side left
	
	pack [ frame $w.f4 ]
	pack [ label $w.f4.l -text "End sample" -wi 12] -side left
	pack [ entry $w.f4.e -textvar ::beepgen_v1::generator(end) -wi 7 ] -side left
	
	pack [ button $w.genB -text Generate -command ::beepgen_v1::Generate]
	pack [ frame $w.f] -side bottom -fill x   
	label $w.f.lab -text "" -width 1 -relief sunken -bd 1 -anchor w
	pack $w.f.lab -side left -expand yes -fill x
	button $w.f.exitB -text Close -command "destroy $w"
	pack $w.f.exitB -side left
    }

    proc SetSample { n val } {
	variable generator

	if {[snd cget -format] == "Lin8"} {
	    set val [expr {$val + 128}]
	}
	
	switch $generator(chan) {
	    both {
		snd sample $n $val $val
	    }
	    left {
		snd sample $n $val ?
	    }
	    right {
		snd sample $n ? $val
	    }
	    "" {
		snd sample $n $val
	    }
	}
    }
    
    proc Generate {} {
	global v
	variable generator

	if {[snd length] == 0} { snd length 16000 ; ::Redraw}

	#    set generator(sta) [Marker2Sample m1]
	#    set generator(end) [Marker2Sample m2]
	set len [expr {$generator(end) - $generator(sta)}]
	set j $generator(sta)
	
	if {$generator(type) == "sine"} {
	    for {set i 0} {$i < $len} {incr i} {
		SetSample $j [expr {int($generator(amp) * sin($i*3.14159265358979*2*$generator(frq)/$v(rate)))}]
		incr j
	    }
	} elseif {$generator(type) == "square"} {
	    for {set i 0} {$i < $len} {incr i} {
		if {[expr {sin($i*3.14159265358979*2*$generator(frq)/$v(rate))}] > 0.0} {
		    SetSample $j $generator(amp)
		} else {
		    SetSample $j -$generator(amp)
		}
		incr j
	    }	
	} else {
	    for {set i $generator(sta)} {$i < $generator(end)} {incr i} {
		SetSample $i 0
	    }
	}
	snd changed new
	::Redraw
    }
}