«Amplitude Modulation GUI Demo» by Bruno Ruviaro

on 08 Sep'13 22:37 in guisynthesis techniquesamplitude modulation

Simple but nice interface to play with basic amplitude modulation.

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
// ************************************
// Amplitude Modulation (GUI)
// Patch 1 - Basic Demo
// Bruno Ruviaro, 2013-08-02
// ************************************

/*

Very simple interface to play with basic amplitude modulation.
Amplitude Modulation (AM): one oscillator controls the amplitude of another.
Imagine a note the amplitude of which goes up and down at a given speed.

Select all (ctrl + A), then evaluate (ctrl + period).
Watch the spectrum on the Frequency Analyzer window.

*/

s.waitForBoot({

	var win, carrFreqKnob, carrFreqNumber, carrFreqLabel, modFreqKnob, modFreqNumber, modFreqLabel, volumeSlider, defaultFont, carrSpec, modSpec, synth;

	defaultFont = Font("Verdana", 16, bold: true);

	// Main window
	Window.closeAll;
	FreqScope.new;
	win = Window.new("Amplitude Modulation", Rect(20, 400, 610, 280));
	win.onClose = {s.freeAll; Window.closeAll; "Amplitude Modulation window closed.".postln; "".postln};
	win.front;
	win.background = Color.grey;
	win.alpha = 0.95;

	// Carrier Frequency Knob
	carrSpec = ControlSpec(20, 20000, 'exp', 0, 440, " Hz");
	carrFreqKnob = Knob.new(win, Rect(20, 20, 200, 200))
	.action = {arg v;
		var freq = carrSpec.map(v.value);
		carrFreqNumber.string = freq.round;
		synth.set(\carrFreq, freq)};
	carrFreqKnob.value = carrSpec.unmap(carrSpec.default);

	// Carrier Frequency Number
	carrFreqNumber = StaticText.new(win, Rect(80, 210, 80, 25));
	carrFreqNumber.background = Color.grey;
	carrFreqNumber.alpha = 0.95;
	carrFreqNumber.align = \center;
	carrFreqNumber.string = 440;
	carrFreqNumber.font = defaultFont;

	// Carrier Frequency Label
	carrFreqLabel = StaticText.new(win, Rect(20, 240, 200, 25));
	carrFreqLabel.string = "Carrier Frequency";
	carrFreqLabel.align = \center;
	carrFreqLabel.font = defaultFont;

	// Modulator Frequency Knob
	modSpec = ControlSpec(0.5, 5000, 'exp', 0, 2, " Hz");
	modFreqKnob = Knob.new(win, Rect(260, 20, 200, 200))
	.action = {arg v;
		var freq = modSpec.map(v.value);
		modFreqNumber.string = freq.round(0.1);
		synth.set(\modFreq, freq)};
	modFreqKnob.value = modSpec.unmap(modSpec.default);

	// Modulator Frequency Number
	modFreqNumber = StaticText.new(win, Rect(320, 210, 80, 25));
	modFreqNumber.background = Color.grey;
	modFreqNumber.alpha = 0.95;
	modFreqNumber.align = \center;
	modFreqNumber.string = 2;
	modFreqNumber.font = defaultFont;

	// Modulator Frequency Label
	modFreqLabel = StaticText.new(win, Rect(260, 240, 200, 25));
	modFreqLabel.string = "Modulator Frequency";
	modFreqLabel.align = \center;
	modFreqLabel.font = defaultFont;

	// Volume Slider
	volumeSlider = EZSlider(
		parent: win,
		bounds: Rect(510, 20, 70, 230),
		label: "VOLUME",
		controlSpec: ControlSpec(-40, 0, \lin, 0.1, -24, "dB"),
		action: {|ez| synth.set(\amp, ez.value.dbamp)},
		labelWidth: 80,
		unitWidth: 30,
		layout: 'vert')
	.setColors(
		stringColor: Color.black,
		sliderBackground: Color.grey(0.9),
		numNormalColor: Color.black)
	.font = Font("Verdana", 14, bold: true);

	volumeSlider.numberView.align = \center;
	volumeSlider.unitView.align = \center;

	{
		SynthDef("amp-mod", {arg carrFreq = 440, modFreq = 2, amp = 0.06;
			var carrier, modulator;
			carrier = SinOsc.ar(carrFreq);
			modulator = SinOsc.ar(modFreq).range(0, 0.8);
			Out.ar(0, carrier * modulator * amp);
		}).add;

		s.sync;

		synth = Synth("amp-mod");

	}.fork;

	CmdPeriod.doOnce({win.close});

}); // end of waitForBoot
raw 3519 chars (focus & ctrl+a+c to copy)
reception
comments