| Home CBM ASCII-X BASIC Disk Commands Enter RUN mode Program Format Secret Variables Variable Format Expressions Keywords (divide) (equal) (less) (minus) (more) (multiply) (plus) (power) Abs And Append Asc Atn Auto Backup Bank Begin Bend Bload Boot Box Bsave Bump Catalog Char Chr Circle Close Clr Cmd Collect Collision Color Concat Cont Copy Cos Data Dclear Dclose Dec Def Delete Dim Directory Dispose Dload Do Dopen Draw Ds Ds string Dsave Dverify El Else End Envelope Er Err Exit Exp Fast Fetch Filter Fn For Fre Get Get num Getkey Go Gosub Goto Graphic Gshape Header Help Hex If Input Input num Instr Int Joy Key Left Len Let List Load Locate Log Loop Mid Monitor Movspr New Next Not Off On Open Or Paint Peek Pen Pi Play Pointer Poke Pos Pot Print num Pudef Quit Rclr Rdot Read Record Rem Rename Renumber Restore Resume Return Rgr Right Rlum Rnd Rreg Rspcolor Rsppos Rsprite Run Rwindow Save Scale Scnclr Scratch Sgn Sin Sleep Slow Sound Spc Sprcolor Sprdef Sprite Sprsav Sqr Sshape St Stash Step Stop Str Swap Sys Tab Tan Tempo Then Ti Ti string To Trap Troff Tron Until Using Usr Val Verify Vol Wait While Width Window Xor Syntax Tokens C128 D64plus Disk Escape Codes Hardware PCxface PETSCII Pet2asc Futurama IBM PC-AT Contact Games Glossary Hall of fame Hall of shame Miscellaneous Privacy policy Programming Twisty puzzles |
SOUND voice , frequency , duration [ , [ direction ] [ , [ minFrequency ] [ , [ stepFrequency ] [ , [ waveform ] [ , pulseWidth ] ] ] ] ]
Sound generation. Play one of the sound chip's voices at a given frequency for specific duration.
SOUND allows you to gererate a simple sound effect or play a single note in a musical score. In order to hear any SOUND, the system volume must be set to a non-zero value (see VOL), and you will need speaker(s) connected to the machine. In version 7.0, the FILTER may also affect the results of SOUND. The voice, frequency, and duration parameters are required. If any of them are missing, or any parameter has an invalid expression, SYNTAX ERROR is generated. The remaining (optional) parameters are allowed only in BASIC v7.0. If any parameter is not numeric, TYPE MISMATCH ERROR occurs; a string may converted with VAL. Floating-point numbers are converted automatically converted with INT. If the result is not a Legal Value (see table above) then ILLEGAL QUANTITY ERROR occurs. The TED chip (v3.5) has two identical voices, 1 and 2. They sound like sawtooth waveform to me. The final, voice 3, sounds like noise to me. The SID chip (v7.0) has three identical voices. Whichever one is used, a choice of waveforms is available. The default is a rectangular waveform with 50% duty-cycle (explained below). Each voice is independant, so you can play 1, 2, or all 3 of them at the same time, each with different parameters. Playing all 3 voices at once with the proper settings will generate a chord. Frequency controls the pitch of the generated sound. Unfortunately, frequency, minFrequency, and stepFrequency are not in scientific units of Hertz (Hz), nor common musical notation (like A, A#, B, etc.), but a machine-specific frequency unit. So not only does the effect of frequency vary between v3.5 and v7.0 (due to different sound chips), but the same version/chip can vary in effect with the same frequency depending on NTSC/PAL standard of the machine. Note the TED chip (v3.5) has an offset in frequency so that 0 is not zero. This was surely by design, due to its limited range of frequency values (0 to 1023). For BASIC 7.0 (the SID chip), the actually frequency produced is either
Thus a frequency value of 1000 (for example) will produce an audio output of 60.8 Hz on an NTSC machine or 58.4 Hz on a PAL machine. The maximum fundamental frequency possible (with a value of 65535) is thus either
This range of frequencies (0 to roughly 4 kHz) is fine for music, but limiting for sound effects. The SID chip can produce higher frequencies only by indirect methods (mainly, harmonic overtones). If a high-frequency sound effect is desired, it is useful to apply a high-pass filter to the voice so that the harmonics are emphasized and the fundamental is attenuated. The duration controls how long the voice will play a sound. The duration is only partially compatible between v3.5 and v7.0. Although both are essentially measured in Jiffies, v7.0 limits duration to a smaller range of Legal Values. This is normally not an issue, because the new lower limit (32767) corresponds to a ridiculously long duration of over 9 minutes! Unlike the system Jiffy Clock (see TI), which adjusts Jiffy values for NTSC/PAL system timing, SOUND does not adjust duration. So on an NTSC machine, duration is in "jiffies" (1/60 of a second each) but on PAL systems, duration is really in duo-centi seconds (2/100 or 1/50 of a second each). Thus a program written on an NTSC machine will play a sound an extra 20% longer when RUN on a PAL machine; a program written on a PAL machine will play a sound 16.6.6% shorter when RUN on an NTSC machine. Once SOUND starts a voice, it continues with the next statement in the program (if any). After the specified duration, BASIC will silence the voice no matter where in the program BASIC might be. If a program ends with SOUND playing, it will also continue in direct mode for the specified duration. Each voice can only play one SOUND at a time. If the specified voice is currently/already playing when another SOUND statement is executed, BASIC will wait for the previous SOUND to finish before it executes the new one. There is one exception: if the duration is zero then SOUND will immediately silence the voice. The direction, minFrequency, and stepFrequency are mainly used for generating sound effects, as opposed to playing a musical note. However with the proper values it might be useful for playing a note with a trill or mordent. In short, these parameters cause the voice to modulate its frequency while playing. For this to work at all, the stepFrequency must be a non-zero value. Because zero is the default, it really should come before direction and minFrequency in the Syntax! In addition, the minFrequency (using the same units as frequency) must be different than the frequency. The minFrequency has a default of zero which is useful for some sound effects, but for other sound effects, and especially for musical notes, you will probably want its value closer to frequency. When SOUND starts the voice it begins with the indicated frequency (which we'll see is also the maxFrequency). Then each IRQ (occurs 60 or 50 times per second for NTSC and PAL respectively) the frequency is adjusted by stepFrequency: if the direction is 0 then the frequency will be increased until it excedes the maxFrequency at which point it will reset (wrap-around) to the minFrequency; if the direction is 1 then the frequency is decreased until it precedes the minFrequency at which point it will reset (wrap-around) to maxFrequency; finally, if the direction is 2 then the frequency is first increased (like when direction is 0) but when the maxFrequency is reached, the frequency begins decreasing (like when direction is 1), and when frequency reaches the minFrequency it will start over by increasing frequency again (in other words, the frequency will "smoothly" oscillate between minFrequency and maxFrequency without the harsh wrap-around). A direction of 2 is usually what you want for a trill or mordent; however if the stepFrequency is very small (releative to the duration) then direction 1 might work too. The stepFrequency should be smaller than half the difference between (max)frequency and minFrequency, although BASIC does not require this. If not, the effects of direction just described may seem reversed. I like to think of this phenomenon as delta-frequency aliasing (don't know what, if any, is the correct term), but it is the audio equivalant of Moiré patterns in images. * TO DO * Describe what happens when minFrequency is greater than (max)frequency. The next to last parameter, waveform, controls the timbre of the sound, just like a "C" played on piano will sound different than a "C" played on a guitar. A value of 0 produces a triangle waveform which is a poor digital imitation of a sine wave, and sounds similar to some wind instruments, like flutes. A value of 1 produces a sawtooth waveform and sounds like some brass instruments, like trumpets. A value of 2 produces a rectangular waveform and is quite versatile because you can control its duty-cycle (described below). Finally a value of 3 produces a noise waveform which is mostly useful for sound effects like ocean waves and explosions, but might be useful for a precussion instrument like a snare drum. If a rectangular waveform is selected (the default), the final parameter, pulseWidth species the duty-cycle by this equation: dutyCycle = 100% * pulseWidth / 4096. The default pulseWidth of 2048 thus produces a 50% duty-cycle which is a special case of the rectangular waveform known as a square wave. Using different values for pulseWidth allows a nice variety of sound timbres. At 50% the sound quality is at its "fullest" sounding like some cross between a stringed instrument and a horn... the classic digital synthesizer sound. As the duty-cycle moves away from 50%, the sound quality becomes more "reedy" and softer. You will hear nothing when the duty-cycle reaches 0% or 100%. Values below 50% sound the same as their "complement" above 50%; so a 40% duty-cycle sounds the same as 60% duty-cycle (they are both 10% away from 50%). This is because the human ear is indifferent to phase modulation (a 40% duty-cycle waveform is a 180-degree phase-shifted version of a 60% duty-cycle waveform). The SOUND statement does not allow you to control the amplitude or loudness of the voice. All voices play at the same amplitude specified by the master volume. Hardware note: in v7.0, the voice of the SID chip is played using attack, decay, and release parameters of maximum speed (0 value) and a sustain parameter of maximum amplitude (15 value). Because of the NTSC/PAL differences in the frequency parameter, and the lack of volume control of each voice, you may find the PLAY command to be useful. Although it is designed for playing musical scores and not sound effects; with that command you can't create frequency sweeps like you can using the direction parameter of SOUND. Examples (v3.5):
Examples (v7.0):
© H2Obsession, 2014, 2017 |