File: pulse.ck

package info (click to toggle)
chuck 1.5.5.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 41,056 kB
  • sloc: cpp: 123,473; ansic: 35,893; javascript: 2,111; yacc: 609; makefile: 457; python: 174; perl: 86
file content (51 lines) | stat: -rw-r--r-- 1,902 bytes parent folder | download | duplicates (2)
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
//------------------------------------------------------------------------------
// name: pulse.ck
// desc: basic demo using PulseOsc UGen to do pulse width modulation
//
// This UGen defines an oscillator that uses Pulse Width Modulation (PWM), a
// process that allows for the control of the width of output pulses while
// keeping the frequency constant. The on/off ratio of the signal is called the
// "duty cycle". A pulse wave may be thought of as a square wave with adjustable
// time between cycles. A square wave has a duty cycle of 50% -- alternating
// between "on" and "off" in equal proportions. A duty cycle of 75% would mean
// the pulse signal is "on" three times as long as it is "off" in one cycle.
// The PulseOsc UGen can be used to create sound, or to control other signals!
//
// author: Alex Han
// date: Spring 2023
//------------------------------------------------------------------------------

// connect
PulseOsc pulse => dac;
// set gain
pulse.gain( .2 );
// set frequency
pulse.freq( 110 );

// The key characteristic of PulseOsc is the ability to set the pulse width
// (i.e. duty cycle). When the pulse wave is used to create sound, varying
// the duty cycle affects the timbre. This demo shows how the timbre changes
// significantly with small changes to the pulse width.

// time loop
while( true )
{
    for( int i; i < 20; i++ )
    {
        // .width() takes a float from 0.0 to 1.0
        pulse.width( .05 * i );
        // print
        chout <= "current duty cycle: " <= pulse.width();
        // floating point equality
        if( Math.equal( pulse.width(), .5) )
        {chout <= " <- this is just a square wave!";}
        // newline
        chout <= IO.newline();
        // next time step
        .5::second => now;
    }
}

// for more PWM fun...
// 1) smoothly vary the pulse width (using a small time scale)
// 2) filter the sound (e.g., with LPF)