snd some.sndwhere "some.snd" is any available sound file. You should get a window with the first .1 seconds of the sound displayed as a time domain waveform. Click the file name at the lower left to get some information about the file. Click the "f" button, and an fft window appears alongside the waveform. Drag the upper scale at the bottom of the graph and both graphs are updated as you move through the file. Drag the lower scale to zoom in or out. Drag the outer scale (the wider one) on the left to zoom the y axis in or out. The inner scale moves the y axis up and down; its main use is to move the waveform out of the way of a mix console. Click the "w" button (to unset the button) and the time domain waveform goes away. Click "play" to play the file. "sync" is more complicated -- it is used to group sounds together for simultaneous editing.
Now return to the time domain form (click "w" and "f"), and click on the graph itself. A red cursor (a big "+") appears at that point. The cursor is exactly like an Emacs cursor -- you can delete the sample at the cursor, for example, by typing control D (abbreviated in this document C-d), or move back one sample with C-b. To see all the cursor-related commands, go to the "Help" Menu, and choose "Click for Help". The cursor becomes a question mark. Move the cursor to the graph portion of the window and click, and a help window pops up, telling all about it. You can use the same sequence to get help for anything in the Snd window, even the vertical bar after the file name.
Now click and drag the mouse through some portion of the graph -- the portion dragged is highlighted in some way. When you release the mouse button, the highlighted portion is 'selected' -- it becomes a 'region' that can be deleted, pasted elsewhere (move the mouse and click the middle button), played, and operated on in many ways. You'll notice if you make some change to the data that the file name gets an asterisk, as in Emacs, and the various 'undo' and 'redo' menu options come to life. Just for laughs, cut the selection, then click the right mouse button to get the popup menu, and try Undo followed by Redo. Next type C-m -- this sets a mark at the current cursor location. C-a goes to the start of the window; C-j jumps forward to the nearest mark. Click and drag the upper horizontal mark portion to move the mark; click the triangular lower portion to play from the mark. Drag the triangular portion to play the data following the mouse.
Finally, go to the View menu and select 'Show controls'. A new portion of the Snd window is opened, containing a number of controls. Try goofing around with them while playing the sound. For the more complex cases, the button on the right side turns the option on or off. The sequence of changes you make while playing can be remembered (the 'Record' button), replayed ('Replay') or applied to the data as a kind of giant editing operation ('Apply').
File Menu Open: open a new file (C-x C-f) Close: close a file, flush any unsaved edits (C-x k) Save: save current edits, overwriting previous version (C-x C-s) Save as: save current edits under a new name, stay in current file Revert: flush edits Update: re-read file (data changed behind Snd's back) View: open file read-only Mix: mix file New: create a new, empty file Record: record sound producing a new file Print: produce a Postscript version of current display Exit: leave Snd, flushing all pending editsSnd operates on sound files. When invoked, Snd scans its arguments for file names, and opens any it finds.
snd oboe.snd fyow.sndIf there are no arguments, Snd comes up as a bare menu bar. If a name is preceded by "-p", it is treated as a directory name and all sound files found in that directory are preloaded into the previous files list. To load arbitrary Snd customizations (a session file for example) precede the file name with "-l". You can also precede a file name with "-remote"; if a Snd editor is already running, the indicated file is opened in that program; otherwise a new Snd is started which opens the file. This is intended to be similar to netscape's -remote switch.
Each sound file in the argument list can include start up
information about the size and location of the
initial waveform display.
snd oboe.snd -s "0.0,0.25,0.75,0.3"
The flag "-s" introduces the size information,
followed by a string containing the values of
the x position, y position, x zoom, and y zoom
scrollbars.
A file can be opened from the File menu via Open or View. View opens the file read-only, whereas Open will allow it to be changed. The equivalent keyboard command is C-x C-f. You can also drag a sound file's icon and drop it on top of the Snd icon or the Snd menubar. If a file cannot be written (either it was opened read-only or you don't have write permission on it), a lock appears next to the file name. Similarly, if Snd notices that the file on the disk no longer matches the original, a bomb appears (this can happen if some other program writes a sound while you are editing an earlier version of it; see also overwrite-check).
In the file selection dialog, there's a button marked 'Sound files only'. This can be set by default (see Customization). If it is set, only files that appear to be sound files are included in the directory listing. Currently Snd uses the file extension to decide whether it is a sound file -- the acceptable extensions are snd, wav, aiff, au, aifc, voc, wve, and perhaps others.
Snd uses CLM's file header and data readers/writers so the file and data types that it can handle are:
Each file has its own 'pane', a horizontal section of the overall Snd screen space; within that section, each channel has a pane, and below the channels is the 'control pane', normally hidden except for the file name and 'minibuffer'. The panes can all be independently raised and lowered by dragging the pane buttons on the right. The channel that is currently active (receiving keyboard commands) has a thin black border around the display portion. Each channel has the four scrollbars setting what portion of the data is displayed; the 'w' button (normally set) which causes the time domain waveform to be displayed; and the 'f' button (normally unset) which includes the frequency domain (FFT) display. There is a third display settable by user-provided functions; if both the 'w' and 'f' buttons are off and there is no active user-display function, you get an empty display. For each sound there is a control panel containing the file name, with an asterisk if there are unsaved edits, a 'minibuffer' for various kinds of text-based interactions, a 'sync' button for grouped display and edit operations, a 'unite' button (if the sound has more than one channel), and a 'play' button to play the current (edited) state of the file. Any number of files can be played at the same time. The rest of the control panel modifies how the file is played.
To open a new, empty file, use the New option.
To close a file (flushing any unsaved edits), use the File menu Close option, or C-x k. This command applies to the file that contains the active channel, or the top file in the display.
To save the current edited state of a file, use the Save option (to overwrite the old version of the file), or Save as (to write to a new file, leaving the old file unchanged). The equivalent keyboard command is C-x C-s (save). Other related keyboard commands are C-x w (save selection as file), and C-x C-w (extract and save the current channel as a file). Normally, if the new file already exists, and it is not currently being edited in Snd, it is silently overwritten. If you try to overwrite a file, and that file has active edits in a different Snd window, you'll be asked for confirmation. If you want Snd to ask before overwriting a file in any case, set the resource overwriteCheck to 1, or include the expression (overwrite-check) in your .snd initialization file.
To undo all edits and return to the last saved state of a file, use the Revert option. The edit history is still available, so you can redo all the edits in order simply by calling Redo repeatedly.
The Print option fires up the Print dialog. You can send the currently active graph directly to a printer, or save it as an "encapsulated Postscript" file. The default name of this file is "snd.eps"; the resource that overrides this default is named 'epsFile'.
To mix files, see "Mix Files". To record a file, see "Record Files".
Finally, to exit Snd cleanly (that is, removing any temporary files, and cleaning up some system stuff), use the Exit option. Unsaved edits are silently flushed.
View Menu Show controls: show/hide the control panel (C-x C-o, C-x C-c) Normalize: cleanup current Snd display Channel style: separate, combined or superimposed channels Info: describe current file Dots: use dots or lines in the data displays Verbose cursor: describe the current sample every time the cursor moves Regions: a browser to examine the region stack Files: a browser of currently and previously loaded files Color: a browser that sets color schemes Orientation: a browser that sets spectrogram and wavogram orientation Groups: group editor (mixing) Show marks: show or hide current marks Show y=0: show or hide the y=0 line X axis units: x axis labelled in seconds, samples, percent of totalThe file display can be modified in various ways. To use dots rather than connected lines, use the Dots option in the View menu (see also dot-size). Similarly, to show (or hide) the line Y = 0, use the y=0 option. The Region browser is described under Regions. To open the control panel, use Show Controls. You can also drag the associated pane button. When many files are displayed, and the pane buttons have been in use, the overall display can become a bit of a mess. To return to a state where each file and channel has a 'normal' amount of space, use the Normalize option.
The Color and Orientation options activate windows that set various aspects of the sonogram, spectrogram, and wavogram displays. There are eight or nine colormaps available along with ways to invert the maps, and scale (darken) them differently according to screen or printer characteristics. And the graphs themselves can be rotated and resized. The color variable default settings produce good output on the SGI but looks cluttered on some Linuces -- you may have to play around with the lightness scaler and so on to find reasonable values for your system.
The Info dialog can be left in view and updated with M-v i to reflect the currently active sound. Except for the header comment, the same information is displayed in the minibuffer when you click the file name.
The Files option fires up the file browser:
The file browser window shown above provides two lists, one of
the currently active files in Snd, and
the other of previously active files. The currently selected
sound is highlighted.
The save button saves current edits, if any; the
play button plays the file; and the
unlist button removes a file from the
previous files list.
Click a current file name, and
that sound becomes the selected sound in the main
Snd window. Click a previous file name, and
that file is opened in Snd.
The 'update' button runs through the previous files
list checking for files that have been deleted or moved behind Snd's back.
'Clear' clears the previous files list. The previous
files list can be preloaded via the -p switch to Snd, and the extended commands preload
and preload-file-browser.
By preloading your "working set" of sounds, you can save
the bother of picking them up one by one from the
clumsy file selection box.
The Regions option is described below.
Options Menu FFT size: length of FFT (defaults to 256) Show peaks: show or hide listing of FFT peaks Log freq: log or linear frequency axis for FFT FFT in dB: log or linear magnitude axis for FFT FFT style: normal FFT, sonogram, or spectrogram FFT window: FFT window choice (defaults to 2nd order Blackman-Harris) FFT beta: FFT window parameter, if relevant Zoom style: where to focus during zooms Subsampling off: graph subsampling on or off Save options: save current state of options Session: save current state or load previous session Speed style: control panel speed scrollbar interpretation Transform type: Fourier, Wavelet, Hankel, Chebyshev, etcThe Options Menu applies mainly to the FFT display triggered by setting the 'f' button in the channel window. Most of the options should be self-explanatory. The FFT is taken from the start (the left edge) of the current window and is updated as the window bounds change. The fft data is scaled to fit between 0.0 and 1.0 unless the variable normalize-fft is 0 (its default is 1). The full frequency axis is normally displayed, but the axis is "dragable" -- put the mouse on the axis and drag it either way to change the range (this is equivalent to changing the variable sono-max).
The harmonic analysis function is normally the Fourier Transform, but others are available, including about 20 wavelet choices, the Hankel and Chebyshev transforms, and perhaps others. (The Hankel transform returns the Bessel function spectrum, the Chebyshev transform returns the Chebyshev polynomial spectrum).
The easiest way to change the colormap and graph orientation of the spectrogram, wavogram, and sonogram, is to use the Color and Orientation dialogs from the View menu. You can also use the numeric keypad, macros, or M-x (Lisp-like) expressions. In the latter case, sono-max sets the maxmimum frequency displayed, spectro-[xyz]angle and spectro-[xyz]scale set the orientation and size of the graphs, and spectro-hop sets the density of traces. The numeric keypad is mapped to these variables as follows:
variable increase decrease sono-max PageUp (9) PageDown (3) spectro-hop Add (+) Subtract (-) ;also wavo-trace spectro-zangle RightArrow (6) LeftArrow (4) spectro-xangle Ctrl-UpArrow (8) Ctrl-DownArrow (2) spectro-yangle Ctrl-RightArrow (6) Ctrl-LeftArrow (4) spectro-zscl UpArrow (8) DownArrow (2) ;also wavo-zscl fft-size Multiply (*) Divide (/) dot-size Delete (.) Insert (0)
A somewhat frivolous feature, known to Snd as the
"wavogram", mimics the spectrogram in the time domain.
The same rotation commands apply to this display,
with the additional variable wavo-hop which sets the
density of the traces. To get this display (or
turn it off) M-x (wavo)
. It is
important in this case to get the length of each trace
correct so successive peaks more or less line up. The
trace length in samples is set by the variable wavo-trace,
or the numeric keypad + and - keys.
When large amounts of data are being displayed, Snd may subsample the data to speed up the display process. This can introduce artifacts of the sampling interval on rare occasions. The Subsampling option turns this on or off. If you are displaying large portions of a sound and notice odd periodicities in the overall envelope displayed, try turning off subsampling before drawing any conclusions about the data.
The Save options menu option is best explained as a part of the customization process described below. It basically sets up an initialization file for Snd that sets all the options to their current settings; this is intended to be similar to a .emacs file (its default name is .snd).
The Zoom style option determines the graph point that tries to remain stable in the display during an x-axis zoom. The default is to zoom onto the cursor or the beginning of the current selection if either is visible. You can also have zoom focus on the left edge, right edge, or midpoint of the current window.
Edit Menu Undo: Undo last edit (C-x C-u or C-_) Redo: Redo last edit (C-x C-r) Find: Global search via find dialog (C-s, C-r) Cut: Cut (delete) selected portion Paste: Paste (insert) selected portion (C-y, C-x i) Mix selection: Mix (add) selected portion (C-x q) Play selection: Play selected portion (C-x p) Save selection: Save selected portion as file (C-x w) Edit Envelope: Edit or view envelopesEditing in Snd is modelled after Emacs in many regards. Each channel has a cursor (a big "+"), a set of marks, and a list of edits that have not yet been saved. Most operations take place at the cursor. Operations can be applied simultaneously to any other channels or sounds by using the 'sync' button. And as in Emacs, there is a notion of a region ('selection'), and a list of saved regions. Operations can be applied either to a sample, a region, a channel, a file, or any number of files at the same time. Where an operation has an obvious analog in text editing, I've tried to use the associated Emacs command. To delete the sample at the cursor, for example, use C-d.
The following sections describe how to move the cursor and
the window; how to change which channel is active;
how to use marks and regions; how to perform various
common editing operations. We end with a description of
all the mouse and keyboard editing commands. The 'control
panel' provides more complex editing operations, but
has a chapter to itself.
The Active Channel and The Cursor
< move cursor to sample 0 > move cursor to last sample C-< move cursor to sample 0 C-> move cursor to last sample C-a move cursor to window start C-e move cursor to window end C-b move cursor back one sample C-f move cursor ahead one sample C-n move cursor ahead one 'line' C-p move cursor back one 'line' C-v move cursor to mid-window C-i display cursor info C-j go to mark C-x j go to named markAll keyboard commands accept numerical arguments, as in Emacs. If the argument is a float, it is multiplied by the sampling rate before being applied to the command, so C-u 2.1 C-f moves the cursor forward 2.1 seconds in the data.
Various keyboard commands provide much more precise control of the window bounds and placement:
C-l position window so cursor is in the middle C-x b position window so cursor is on left margin C-x f position window so cursor is on right margin [Down] zoom out, amount depends on shift, control, and meta [Up] zoom in [Left] move window left [Right] move window right C-x l position selection in mid-view C-x v position window over current selection C-x C-b set x window bounds (preceded by number of leftmost sample) C-x C-p set window size (preceded by size as numeric argument)As in most other cases, the sample numbers (or sizes) can be floats; if the argument is not an integer, it is multiplied by the sampling rate before being applied to the command. So, C-u .1 C-x C-p makes the window display .1 seconds of data.
Once set, a mark can be moved (redefined) by dragging the horizontal tab at the top. Click on the triangle at the bottom to play (or stop playing) from the mark; drag the triangle to play following the mouse.
A mark can be named or unnamed -- the name is displayed above the horizontal tab at the top of the window. The following keyboard commands relate to marks:
C-m place (or remove if argument negative) mark at cursor C-x / place named mark at cursor C-x C-m add named mark C-j go to mark C-x j go to named markThe distance from the cursor to a mark can be used as a numeric argument for other commands by following C-u with C-m. Any number in-between is the number of marks to jump forward before getting the distance.
The current marks assoicated with a sound can be saved in a
file that Snd will load automatically later. The session
command is the simplest way, but if you want to save just
the marks, use the M-x (save-marks)
command.
Once defined, the selection is added to a stack of currently available regions (the stack size is normally 16). In many cases, the numeric argument to the command below chooses which region in that stack to use in the command. Since it can be hard to remember which region is which, especially since they are constantly on the move as the stack changes, there is a region browser, similar to the File browser, invoked from the View menu's Regions option:
The 'save' button here protects the region from deletion
as the region stack grows. 'Print' produces a Postscript
rendition of the current graph contents, using the default
eps output name. 'play' plays the region. The graphical
display
shows the waveform with arrows to move around in the
channels of multi-channel regions.
The keyboard commands that apply to regions are:
C-y paste in current selection at cursor C-[space] start keyboard-based region definition C-x a apply amplitude envelope to selection see also scale-selection-by and scale-selection-to C-x c define selection from cursor to nth mark C-x h apply external function to selection C-x i insert selection C-x n re-evaluate expression over selection C-x p play selection or region (numeric arg selects region) C-x q mix in selection (float arg = scaler) C-x w save selection as file C-x x evaluate expression over selection C-x y prompt for and apply external function to selection C-x l position selection in mid-view C-x v position window over current selectionCurrently the inter-process selection passing mechanism is disabled because it is very buggy, at least in Motif on the SGI. It's not really of any use in Snd because you can load and edit any number of sounds into one Snd process.
C-x k close currently selected file C-x w save selection as file C-x C-d print C-x C-f open file C-x C-s save file C-x C-w save currently selected channel as fileThe Print command produces a PostScript file which can be sent to directly a printer or saved for later use.
Delete, insert, mix
The fastest way to delete a section is to drag the mouse through it and
call the Edit menu's Cut option. Any active region
can be pasted or mixed in using C-x q and C-x i with a
numeric argument (the region number); the current selection
(region 0) can be pasted in
by clicking the middle mouse button. The
associated keyboard commands are:
C-d delete sample at cursor C-k delete a 'line' -- line-size (128) samples C-w delete current selected portion C-o insert a zero sample at cursor C-x i insert selection at cursor (arg = region number) C-x C-i insert file C-y paste in current selection at cursor C-x q mix in region (float arg scales mix, int arg = region number) C-x C-q mix in file
To get multi-channel selections, set the sync button, then define the selection (by dragging the mouse) in one channel, and the parallel portions of the other channels will also be selected.
Amplitude envelopes and scaling
An envelope in Snd is a sequence of x y break-point pairs.
The x axis range is arbitrary. For example,
to define a triangle curve: '0 0 1 1 2 0'.
There is no (obvious) limit on the number of
breakpoints. Envelopes can be defined with
defvar and referred thereafter by name. This
can save much typing. Use the envelope editor
to draw envelopes with the mouse.
To apply an envelope to a sound, use the extended command C-x C-a. If this command gets a numeric argument, the envelope is applied from the cursor for that many samples. Otherwise, the envelope is applied to the entire file.
C-x a apply amplitude envelope to selection C-x C-a apply amplitude envelope to channelYou can also specify an envelope name to the C-x C-a prompt. The corresponding M-x commands are:
amp-env beg dur scaler env ;beg and dur in samples, env=breakpoints amp-envelope env ;applies from sample 0 to end, scaler=1.0 selection-amp-envelope env ;same but applied to all of selection
M-x (amp-envelope 0 1 1 0 2 1)
, for example, ramps the sound down
to 0 in its middle, then ramps back up to the original by the end.To scale a file or selection by or to some amplitude, use the M-x commands:
scale-by args scale-to args scale-selection-by args scale-selection-to argsscale-by scales the current sync'd channels by its arguments, and scale-to scales them to its arguments (a "normalization"). The arguments in each case are either a list of floats corresponding to each successsive member of the current set of sync'd channels, or just one argument. In the latter case, scale-by uses that scaler for all its channels, and scale-to normalizes all the channels together so that the loudest reaches that amplitude (that is, (scale-to .5) when applied to a stereo file means that both channels are scaled by the same amount so that the loudest point in the file becomes .5).
Find
Searches in Snd refer to the sound data, and are,
in general, patterned after Emacs. When you type
C-s or C-r, the minibuffer below the graph is
activated and you are asked for the search expression.
The expression is a piece of C-like code that describes
which sample satisfies the search. For example,
to look for the next sample that is greater than
.1, we could type: y > .1. The cursor then moves
to the next such sample, if any. Successive C-s's
or C-r's repeat the search. C-x C-s can redefine the
search pattern, which is also cleared by various other
commands, much as in Emacs.
The search (and C-x C-x) expression syntax includes most of C's operators, the standard math library, as well as many variables internal to Snd. To get at the current sample's value (the sample that the cursor is sitting on), use 'y'. 'y(n)' refers to the sample n samples from the current one. 'x' is the current sample number. 'samples' is the total number of samples. Similiarly, each of the other channels besides the current one is accessible as y1..8(n) (where the offset argument is optional); the channels are assigned to these yn functions in the order they occur in the Snd display (sounds from top to bottom, channels in order within a sound). As an example, say you want to find where two channels differ:
C-s y != y1Or you want to find where the current channel has three consecutive zeros:
C-s (y == 0.0) && (y(1) == 0.0) && (y(2) == 0.0)Normally, the search applies only to the current channel. To search all active files at once, use the Edit menu's find option.
The available C operators are:
+ - * / > >= < <= == != ( ) { } += *= /= -= = || && ? : !The available math library functions are:
log log10 exp cos sin abs (i.e. fabs) pow sqrt atan acos asin cosh sinh tanh fmod ceil floorVariables can be defined with 'float'. Snd-internal variables that are accessible in these (C-style) expressions include:
x: cursor sample number y: value at cursor (y(n) also) y1..8: value ar cursor (y1(n)) in channel n (counting sounds from top) samples: current length of channel srate: current srate of file pi: 3.14159...The search commands are:
C-r find backwards C-s find forwards
C-z set current sample to zero C-x C-z smooth data using cosineFor more complex operations, you need to use expressions, described under Find. C-x C-x y = .1 sets the sample at the cursor to .1. To set several samples to zero, define a selection over the desired samples, then C-x x y=0. Or use C-u preceding the C-x C-x command. To add a sine wave of amplitude .1 and frequency 440 Hz to the next 1000 samples, first declare a float variable (call it xx -- it will hold the phase), then calculate the sine wave:
C-x C-x float xx C-u 1000 C-x C-x {y += (.1*sin(xx)); xx += (440*pi*2/srate);}The variables can be predeclared in your initialization file with eval, and the actual expressions can be pasted into Snd from Emacs, so the simplest way to keep a useful expression around (until I finally implement functions in this context), is to include lines such as:
(eval "float phase") (eval "float freq") ;{y+=(.1*sin(phase)); phase+=(freq*pi*2/srate);}in your .snd file. Then in Snd, set the freq variable via C-x C-x, and call the sine wave expression by selecting the text and pasting it into the Snd minibuffer at the "eval:" prompt. This is admittedly a kludge. I'm trying to decide whether to extend Snd's little lisp here, or add a C define feature, or maybe an escape to CLM. See also Extensions below -- it is possible to add your own arbitrarily complex editing functions to Snd.
Another way to use expressions is to make new sounds from existing
ones. Say we want to make a new sound that is the difference of
two others: make a new file (via the File menu New option, or
M-x (new)
), make room in it (via C-u 1.0 C-o or whatever), then:
C-u 1.0 C-x C-x y = y1 - y2Or say we want to know how many samples in the first second are over .1: declare some counter, then use the C ? operator:
C-x C-x float ctr C-u 1.0 C-x C-x ctr += (y>.1) ? 1 : 0 C-x C-x ctr
C-x r redo last edit C-x u undo last edit C-x C-r redo last edit C-x C-u undo last edit C-_ undo last editRevert is the same as undoing all edits.
Play
To play a sound, click the 'play' button. While it is playing,
you can click the button again to stop it, or click some other
file's 'play' button to mix it into the current set of sounds
being played. To play from a particular point, set a mark
there, then click its 'play triangle' (the triangular portion
below the x axis). To 'rock the reels', that is to play
while dragging the mouse back and forth, drag the mark's
play triangle. The Edit menu 'Play' option plays the current
selection, if any. The Popup menu's 'Play' option plays the
currently selected sound. And the region and file browsers provide
play buttons for each of the listed regions or files. If you
hold down the control key when you click 'play', the cursor
follows along as the sound is played. If you stop the play
in progress, the cursor remains where you stopped it, but
otherwise returns to its original position. Type space
(without control) to pause and continue during playback.
In Linux, the soundcard input lines are sometimes left active by default, causing an amazing amount of hum and whatnot. To try to turn these off, call the M-x function clear-inputs.
The color of the play button corresponds to the state of the playback: normal: not playing, blue: playing, green: playing and tracking with the cursor (if any), red: playback paused.
The keyboard commands for playing are:
C-q play current channel starting at the cursor C-t stop playing C-x p play selection or region (numeric arg selects region)Except in the browsers, what is actually played depends on the control panel.
Mix Files
Since mixing is the most common and most useful
editing operation performed on sounds, there is relatively
elaborate support for it in Snd. To mix in a file, use either the File Mix menu option
or the command C-x C-q. Currently the only difference
between these two is that the Mix menu option tries
to take the current sync state into account, whereas
the C-x C-q command does not. To mix a selection, use
C-x q.
The mix
starts at the current cursor location.
Each individual mix portion has a "mix console", a small box displayed above the waveform containing various controls. These consoles follow the sync buttons where relevant. More importantly, consoles can be edited together by collecting related mix portions into a group, then firing up the Group Editor (via the View menu Groups option). In a sense, a group can be viewed as Snd's way of implementing a more normal mixer's "tracks".
a speaker: while pushed, the input is played an 'x': click to remove the console permanently a box: click to open (or close) the console
To change the scale interpretation, set the variables mix-amp-scaler, mix-speed-scaler, and in the group editor mix-tempo-scaler; all default to 1.0 which gives a scaling from 0 to around 12. These numbers actually scale an exponent, so (for example) if mix-amp-scaler is set to 0.5, the scale goes from 0.0 to around 3.5; similarly if mix-tempo-scaler is 0.025, its scale goes from around .95 to 1.05.
To reduce the mix console to the single letter 'M', double click the file name. Double click the 'M' to return to the original row of icons. Since screen space is at a premium, this minimal form of the console can reduce clutter. You can still drag the 'M' to reposition the mix.
When any edit is performed that changes the file within the mixed portion, the affected mix consoles are removed from the display, and the only way to return to them is to undo the offending edit. That is, if you mix a portion, then cut some part of that portion, the mix will be locked in place from then on, as if you had clicked the 'x' button on the mix console.
To turn off the constant graphics updates (which can slow down old machines like mine, and which can also be annoying when you know what you're doing), set the variable movies to 0 (it is also accessible in the Group Editor).
When a sound is mixed into a file that has its sync button on, the separate channels are tied together so that as long as the sync button is on, if you move one mix console the other sync'd consoles move with it. Similarly, any speed change is reflected automatically in the other consoles; amplitude changes however, are not copied. To make the sync'd consoles independent, turn off the sync button. Once unsync'd, the consoles remain independent unless you 'undo' enough edits to return to the sync'd state.
Normally the console is lined up with its left edge at the beginning of the mixed segment. You can move the console anywhere within the segment by placing the cursor at the position you want to mark the left edge of the console, then control-click in the console title.
To get an indication of the start and end points of the mix segment, set the group editor "show duration" button, or set the Snd variable mix-duration-brackets to 1.
The group editor envelope fields use the same syntax as other Snd envelopes: (0 0 1 1) is a ramp, for example, and (0 0 1 1 2 0) is a sort of pyramid. The envelope data in a given field only takes effect after the field has been "activated" (normally by a carriage return). The tempo envelope is interpreted in terms of the current group times using the placement of the given mix within the group to find the parallel place on the (arbitrary) tempo envelope x axis. The value of the envelope at that point becomes another tempo multiplier; that is, these envelopes are not time maps (perhaps someday!). Since a tempo value of 2 makes things happen twice as slowly (it essentially multiplies begin times), the tempo envelope causes things to go faster as it gets closer to zero -- weird! The speed envelope changes the overall speed of a given segment, but doesn't change within that segment.
The underlying mix consoles have independent envelopes, but my original plan to include envelope text fields in the consoles made them too big, cluttered, and unwieldy; an attempt to make each console a scrollable (or paned) window failed due to unfortunate limitations in Motif. These could be overcome, but would require much more programming than I think the issue is worth. I'm interested in better ideas, if anyone has any. One idea I'm goofing around with makes the mix matrix entries visicalc-like expressions.
To move the cursor from one mix to the next, in the same manner as C-j moves through marks, use C-x C-j. You can also use the M-x function mix-position. The following functions act like lisp structure references (that is, they return their current value, or set it to a new value if called inside setf):
mix-position n mix begin sample mix-length n mix segment length (change at your own risk!) mix-anchor n mix anchor position within segment mix-state n console state mix-groups n which groups mix is associated with (bits) mix-amp n m current mix input scaler on chan m mix-speed current mix speedThe 'n' in each case is the (arbitrary) number of the mix as assigned by Snd. To get this number, click the console title bar.
M-x (setf (mix-position 1) 1234)
moves
mix number 1 to sample 1234; M-x (mix-amp 1 0)
returns the
current scaler on the first input channel of mix 1.
Clicking in the title bar also causes the console in question
to move to the front of the console stack -- use this to
get at consoles that are lying underneath others nearby.
Similar functions access the group state:
group-amp n m group n, amp for chan m group-tempo n group-speed n group-beg n in seconds (moves all associated mixes) group-end n in seconds (moves all assoicated mixes)
Extend the editor
For full details, see the Extensions chapter. The keyboard
commands associated with these external functions are:
C-h repeat last external function call C-x h apply external function to selection C-x y prompt for and apply external function to selection C-x C-h external function call C-x C-l load external function from shared library C-x C-y set up external function to be called whenever window changes
(defmacro jump () (key f 4) (show-controls))moves the cursor ahead one sample and opens the control panel. We can invoke this in Snd with
M-x jump
(global-set-key "a" 'hiho)maps the keystroke "a" (case-sensitive) to the macro "hiho". global-unset-key removes any macro associated with its key argument. A macro can call other macros. I may extend the syntax here to include more of Lisp, but currently a macro is just a list of commands.
Change file format
To change header or data format, use the File or Edit menu Save as option:
Choose the header type you want, then the data format,
(the data format list will change depending on the header
choice). The File version saves the current selected file.
The Edit version saves the currently selected region.
Extend a File
Normally Snd keeps the current cursor, and therefore most
actions you can perform on the current channel, within the
current channel's bounds. The easiest way to extend the
file is to pad it with zeros. Go to the end of the file,
via the C-> command, then use the C-u command with a float
argument, giving the number of seconds to add to the end
of the file, followed by C-o (insert zeros): for example,
to add a second, C-> C-u 1.0 C-o. The same sequence
can be used to add silence to the start of a file.
Record a File
To make a recording, choose "Record" from the File menu.
A window opens with the various recording controls:
The top three panes display the status of the input and output lines.
If a channel is active, its meter will glow yellow.
If some signal clips during recording, the meter will
flash red. The numbers below the channel buttons indicate the signal
maximum since it was last reset. The sliders underneath the meters scale the
audio data in various ways before it is mixed into the output. The
vertical sliders on the right scale the line-in and microphone signals
before the meter, and the output signal before it gets to the speaker
(these are needed to avoid clipping on input, and to set the 'monitor'
volume of the output independent of the output file volume).
The fourth pane has information about the current output file (its name and so on), and the layout of the window. The buttons on the right can be used to open and close panes painlessly. The fifth window contains a history of whatever the recorder thought worth reporting. The duration field gives the current output file's duration. The bottom row of buttons dismiss the window, start recording, cancel the current take, and provide some help. There's also a slider on the far right that controls the speaker output volume (independent of the output file volume).
To make a recording, choose the inputs and outputs you want; for example, to record channel A from the microphone to channel A of the output file, click the Microphone panel's A button and the Output panel's A button. Then when you're ready to go, click the Record button. Click it again to finish the recording.
Not all possible options are available in every system -- Snd will do what it can, and complain if you ask for something it thinks is impossible. Due to hardware problems, I haven't fully tested this on a Linux system, and late model SGI's running the new audio library are a mess. (In Linux with a SoundBlaster 64, the mic and line-in lines appear together in the line-in panel).
Edit or View an Envelope
The Edit Envelope dialog (under the Edit menu) fires up a window
for viewing and editing envelopes.
The dialog
has a display showing either the envelope currently being edited or
a panorama of all currently loaded envelopes. The current
envelope can be edited with the mouse: click at some spot in the graph to place a
new breakpoint, drag an existing breakpoint to change
its position, and click an existing breakpoint to delete it.
The Undo and Redo buttons can be used to move around
in the list of envelope edits;
the current state
of the envelope can be saved with the 'save' button, or
printed with 'print'.
Envelopes can be defined using defvar, and loaded from a separate file of envelope definitions via the Session dialog's Load command. For example, the file:
(defvar ramp '(0 0 1 1)) (defvar pyramid '(0 0 1 1 2 0))defines two envelopes that can be used in Snd wherever an envelope is needed (e.g. C-x C-a). You can also define a new envelope in the dialog's text field; '(0 0 1 1) followed by return fires up a ramp as a new envelope.
In the overall view of envelopes, click an envelope, or click its name in the scrolled list on the left to select it; click the selected envelope to load it into the editor portion, clearing out whatever was previously there. To load an exisiting envelope into the editor, you can also type its name in the text field; to give a name to the envelope as it is currently defined in the graph viewer, type its name in this field, then either push return or the 'save' button.
Once you have an envelope in the
editor, it can be applied to the currently active sounds
via the 'Apply' or 'Undo&Apply' buttons; the latter
first tries to undo the previous edit, then applies
the envelope.
The envelope can be applied to
the amplitude, the spectrum, or the sampling rate. The
choice is made via the three buttons marked 'amp',
'flt', and 'src'.
The filter order is the variable filter-env-order
which defaults to 40. (The equivalent M-X function is
(filter-env order env)
). The sampling rate conversion
sinc width is the variable src-width which defaults to 10
(the equivalent M-X function is (src env)
).
To interrupt the application of the envelope, click the
'Stop' button.
The two toggle buttons at the lower right choose whether to show a light-colored version of the currently active sound (the 'wave' button), and whether to clip mouse movement at the current y axis bounds (the 'clip' button).
Miscellaneous commands
C-g at any point aborts the current keyboard command
sequence, as does any mouse click. C-g can also interrupt some long
computations (search, eval expression, and the various envelope applications).
C-u introduces a numeric argument. Besides the integer and float cases mentioned several times above, you can also use marks to set the argument. If the (optional) number after C-u is followed by C-m, the resultant number passed to the command is the distance (in samples) from the cursor to the n-th successive mark. That is C-u C-m C-f is the same as C-j.
C-x introduces an 'extended command'. It can be preceded by a numeric argument or aborted with C-g. C-x halts any on-going region definition.
C-x d prompts for the temporary directory name. Snd saves some editing operations in temporary files, rather than in-core buffers. If the temporary directory has been set (in various ways), it is used; otherwise Snd looks for the TMPDIR environment variable; if it is not found, or is null, the directory /var/tmp is used.
C-x C-c closes the control panel. C-x C-o opens the panel.
C-x C-x evaluates an expression; C-x C-n re-evaluates it.
The rest of the keyboard commands refer to the currently
active graph, and any graphs that are currently sync'd
to it. In general, commands are analogous to Emacs
where such an analogy exists; in other cases, an
extended command followed by a key with control
affects the current channel whereas the same key
without control affects the selection.
Case is not significant.
File Menu Edit Menu View Menu Options Menu Help Menu
M-f o: Open M-e u: Undo M-v s: Show controls M-o s: FFT size M-h c: Click for help
M-f c: Close M-e r: Redo M-v n: Normalize M-o p: Show peaks M-h o: Overview
M-f s: Save M-e f: Find M-v c: Channel style M-o l: Log freq FFT
M-f a: Save as M-e c: Cut M-v i: Info M-o d: FFT in dB Find
M-f r: Revert M-e p: Paste M-v d: Dots FFT style Undo and Redo
M-f m: Mix M-e m: Mix selection Verbose cursor Speed style Sync
M-f u: Update M-e p: Play selection M-v r: Regions Focus style Speed
M-f n: New M-e s: Save selection M-v b: Files M-o o: Subsampling off Expand
M-f v: View Edit Envelope Color M-o a: Save options Reverb
M-f p: Print M-v o: Orientation M-o w: FFT window Contrast
M-f x: Exit Groups M-o b: FFT beta Envelope
Record M-v m: Show marks Session Marks
M-v y: Show y=0 Transform Type Mixing
Hide consoles Formats
X axis units Customization
User functions
Recording
Most of the commands accept a numeric argument which can be either an integer or a float; an integer causes the command to be repeated that many times; the float is usually multiplied by the sound's sampling rate, then applied that many times. So, for example, C-u 1.0 C-f causes the cursor to move ahead one second in the sound. The argument can be negative to reverse the sense of the command, as in Emacs. It is often useful to use the distance to a mark as a count. If the C-u n command is followed by C-m, the 'n' determines how many marks to move to, then the count returned is the distance from the cursor to that mark. For example, C-u C-m returns the number of samples between the cursor and the next mark, so C-u C-m C-z zeros all the samples between the cursor and the next mark.
The commands are:
[Down] zoom out [Up] zoom in [Left] move window left [Right] move window right [Home] update current file (re-read data from disk) [Space] cancel and deselect selection, return to pre-select position if playing, pause or continue playback <: move cursor to sample 0 >: move cursor to last sample C-<: move cursor to sample 0 C->: move cursor to last sample C-a: move cursor to window start C-b: move cursor back one sample C-d: delete sample at cursor C-e: move cursor to window end C-f: move cursor ahead one sample C-g: abort current command C-h: repeat external function call C-i: display cursor info C-j: go to mark C-k: delete one line's worth of samples C-l: position window so cursor is in the middle C-m: place (or remove) mark at cursor location C-n: move cursor ahead one 'line' C-o: insert one zero sample at cursor C-p: move cursor back one 'line' C-q: play current channel starting at cursor C-r: repeat last search backwards C-s: search according to an expression C-t: stop playing C-u: start count (numerical argument) specification C-v: move cursor to mid-window C-w: delete current region C-x: start extended command (see below) C-y: paste in region C-z: set current sample to 0.0 C-_: undo last edit C-[Space]: start region definition (arg<0 => cancel and deselect)The extended commands (preceded by C-x) are:
a: apply envelope to selection b: position window so cursor is on left margin c: define selection from cursor to nth mark d: get temp dir name e: execute keyboard macro f: position window so cursor is on right margin h: apply external function to selection i: insert region j: go to named mark k: close file l: position selection in mid-view n: re-evaluate expression over selection o: move to next or previous graph p: play selection or region n q: mix in region r: redo last undone edit u: undo last edit v: position window over current selection w: save selection as file x: evaluate expression over selection y: get and apply external function to selection z: smooth selection /: place named mark (: begin keyboard macro definition ): end keyboard macro definition C-a: apply amplitude envelope C-b: set x window bounds (preceded by first sample number) C-c: hide ("close") controls C-d: print C-f: open file C-g: abort command C-h: external function call C-i: insert file C-j: go to mix console C-l: load user function from shared library C-m: add named mark C-n: re-evaluate expression C-o: show ("open") controls C-p: set window size (preceded by size) C-q: mix in file C-r: redo last undone edit C-s: save file C-u: undo last edit C-v: set window size as percentage of total C-w: save current channel in file C-x: evaluate expression C-y: set up auto-call of external function C-z: smooth using cosine
'Speed' here refers to the rate at which the sound data is consumed during playback. Another term might be 'srate'. Snd normally uses linear interpolation to perform the speed change; to use sinc interpolation instead see src-style. The arrow button on the right determines the direction we move through the data. The scroll bar position is normally interpreted as a float between .05 and 20. The Options Speed Style menu (or the speed-style variable) can change this to use semitones (actually microtones) or just-intonation ratios. The number of equal divisions to the octave in the semitone case is set by the variable speed-tones (normally 12).
'Expand' refers to a kind of granular synthesis used to change the tempo of events in the sound without changing pitch. Successive short slices of the file are overlapped with the difference in size between the input and output hops (between successive slices) giving the change in tempo. This doesn't work in all files -- it sometimes sounds like execrable reverb or is too buzzy -- but it certainly is more robust than the phase vocoder approach to the same problem.
There are a variety of variables that control expand's hop sizes, segment lengths, and overall segment envelopes. These can be set in the minibuffer via C-x C-x, or in your Snd init file. In the former, the syntax is C-like; in the latter, Lisp-like. The variables are:
exprmp: the length (percentage of the grain envelope) of the ramp (.4, 0 to .5) explen: the length (seconds) of each slice (.15) exphop: the hop size (.05) (also seconds)The expander is on only if the expand button is set.
The reverberator is a version of Michael McNabb's Nrev. In addition to the controls in the control pane, you can set the reverb feedback gain and the coefficient of the low pass filter in the allpass bank. The variables are 'revfb' and 'revlp'. The reverb is on only if the reverb button is set. The reverb length field takes effect only when the reverb is set up (when the DAC is started by clicking 'play' when nothing else is being played).
'Contrast enhancement' is my name for a somewhat weird waveshaper or compander. It phase-modulates a sound, which can in some cases make it sound sharper or brighter. For softer sounds, it causes only an amplitude change. To scale a soft sound up before being 'contrasted', use the variable contrast-amp. The function maxamp returns the channel's max amp, so the inverse of that is a good first guess for contrast-amp. Contrast is on only if the contrast button is set.
The filter is an arbitrary order FIR filter specified by giving the frequency response envelope and order in the text windows provided. You can also specify the filter coefficients in a file of floats, then load them into the Snd filter by typing the file name in the filter envelope text window. The filter is on only if the filter button is set.
The 's' (for 'Save') button saves the current control panel state for a subsequent 'Restore'. The 'r' (for 'Restore') button returns the control panel to the state at the time of the last save, or the initial state if there has been no save.
Except for the filter setting and the reverb length setting, the controls can be changed as the sound plays. You can record the changes you make by setting the 'Record' button, and replay the new version later with 'Replay'. The latter actually takes effect only when play is set in motion. 'Replay' and 'Record' can be set at the same time, allowing you to add more changes or override previous ones. To take all the current recorded changes and turn them into a giant 'edit' of the file, click the 'Apply' button. Apply may change the length of the file; for example, if reverb is on, the reverb decay length (revdecay) is added onto the end. Once Apply has taken effect, the controls section is not currently reset to its clean state, so to hear the applied version of the sound (i.e. to hear the effect of the edit you just did by clicking Apply), remember to click the 'r' button to reset the controls. Maybe this should be the default...
Snd's control panel is not intended to replace mixers or CLM -- I view it as a quick-and-dirty 'cartooning' facility. After finding useful settings, you'll want to save the recorded changes and run them through CLM or some other hi-fi signal processing system.
The keyboard commands associated with the control panel are:
C-x C-o show ("open") control panel C-x C-c hide ("close") control panel
;; File Menu (open file) ;open file read/write (close file) ;close file, add to previous files list (save file) ;save current edits to file (save-as file1 file2) ;save current state of file1 as file2 (revert file) ;cancel edits, if any, to file (view file) ;open file read-only (new) ;create new (empty) file (print) ;print current graphs (exit) ;exit Snd ;; Edit Menu (undo n) ;undo last n edits in current channel (redo n) ;redo last n undone edits in current channel (find expr) ;find sample that satisfies expr (cut) ;delete selected data, add to region stack (paste n) ;paste region n at current cursor position (play file) (stop file) ;play or stop playing file ;; View Menu (show-marks) (hide-marks);show or hide marks (show-y-zero) ;show or (hide-y-zero) ; hide the y=0 line (normally hidden) (dots) (lines) ;show waveforns using dots or lines ;dot-size variable (keypad ".") sets size of dot (unite) (separate) ;combine or separate channels in multi-channel sounds (normalize) ;normalize Snd display (info) ;show sound type, header comment etc (show-controls) ;show or (hide-controls) ; hide the control panel (show-consoles) ;show or (hide-consoles) ; hide the mini-mix control panels ;; Options Menu (show-peaks) (hide-peaks);fft display can include peaks (peaks) ;place peak data in text window (fft-style n) ;0=normal, 1=sonogram, 2=spectrogram (focus-style n) ;0=window left, 1=window right, ;2=active entity (cursor or region), 3=window middle (fft-dB) (fft-linear) ;choose fft amplitude axis scaling (log or linear) (fft-log-freq) ;choose fft frequency axis scaling (log or (fft-linear-freq) ; linear) (subsampling-on) ;turn data subsampling on or (subsampling-off) ; off (silent-cursor) ;turn minibuffer info about cursor position off or (verbose-cursor) ; on ;; Snd as a whole (fit-data) ;show full file and match y axis to data excursion or (dont-fit-data) ; show first .1 secs and use y axis limits of -1.0 to 1.0 (default-output-type n) ;region temp file header choice (disconnect) ;close IPC fifos (named pipes) (clear-inputs) ;try to turn off soundcard input lines (Linux) ;; Sound window (sound file) ;return the sound data in file (for CLM) (data beg num) ;return data in current channel (for CLM) (goto-sound file) ;select file (goto-channel file chan) ;select channel of file (select-sound n) ;select the nth sound in the current sound list (select-channel n) ;select channel n in current sound (sync) (unsync) ;set or unset sync button of currently selected sound (save-controls) ;save or (restore-controls) ; restore the control panel settings (amp-env beg dur scl env);apply amp env to current synced channels ; from beg for dur (both in samples) scaled by scl (filter-env order env) ;apply env as frequency response curve (amp-envelope env) ;same as amp-env but assume 0 to end with scl=1.0 (selection-amp-envelope env) (scale-by ...) ;amplitude scaling (scale-to ...) ;amplitude scaling (src env-or-num) ;change srate by num or envelope ;; Channel window (x-axis low high) ;set x axis bounds (y-axis max) ;set y axis max (normally 1.0) (axes x0 x1 y0 y1) ;set x and y axis bounds (floats) (maxamp) ;return current channel maxamp (save-marks) ;write current marks (sound-relative) to filename.marks (goto-mark name) ;move cursor to named mark (mark name) ;return sample associated with named mark (delete-mark) ;delete mark at cursor (setf (mark name) sample);place mark at sample (show-fft) (hide-fft) ;show or hide the fft window (show-wave) (hide-wave) ;show or hide the time-domain waveform ;; various browsers (preload directory) ;add sounds in directory to previous files list ; (preload .) -> preload current directory (preload-files-browser list-of-files) ;put list of files in previous files list ; (preload-file-browser pistol.snd fyow.snd) (raw-sound srate chans format defaults) ;set raw data file defaults (color-dialog width height) ;start the color dialog (size = width by height) (orientation-dialog width height) ;start the orientation dialog (file-dialog width height) ;start the file browser (just-sounds) (all-files);in the file selection box, either set ; or unset the just-sounds button ;; regions (region n) ;return data of region n (setf-region low high) ;define region from sample low to high (insert beg num) ;insert data at beg for num samples (change beg num) ;change data (new data follows) (delete beg num) ;delete section from beg for num (temp-dir dir) ;set the temporary file directory to dir (scale-selection-by ...) ;region amplitude scaling (scale-selection-to ...) ;region amplitude scaling (copy) ;copy region to X/Motif clipboard (normally disabled) ;; keyboard (command cmd state) ;mimic keyboard cmd, state: control/shift/meta (4/1/8) (key key state) ;key = char here, not ASCII as in command (global-set-key key val) ;map key (no control/meta bits) to macro named val (global-unset-key key) ;unmap key (applies only to keystroke without control or meta bits) ;; parser (defvar a b) ;declare a with value b (b can be a list to define an envelope) ;(defvar env1 '(0 0 1 1 2 0)) or (defvar three 3.0) (float a) ;declare a new variable (session file) ;save current Snd state as text file of commands (load file) ;load a file of these commands ; (e.g. continue earlier session or get saved macros) (load-function lib fun) ;load external function from shared library (function fun) ;call the external function (save-macros) ;save all current macros at end of init file (save-macro name) ;save the current macro under name (eval expr) ;send expr to the C-style parser/evaluator (tickle-clm) ;try to unwedge a stuck CLM-Snd interface (report-in-minibuffer str) ;print str in minibuffer of currently active sound (append-to-minibuffer str) ;append str to minibuffer contents (override-data-size) ;if header size info is wrong, try to ignore it (use File:Update to re-read data) (dont-override-data-size) ; believe header size info (default) (override-data-location loc) ;make 'loc' the data location, no matter what the header says (dont-override-data-location) ; believe header location info (default) (override-sound-format frm) ;use 'frm' as sound format, no matter what the header says (dont-override-sound-format) ; believe header sound format info (default)The variables that Snd recognizes (in this case) are:
cursor x ;cursor sample number y ;value of sample at cursor window-height window-width ;Snd overall window size (pixels) fft-window fft-size fft-beta ;various fft choices normalize-fft ;whether to normalize fft data to 1.0 zero-pad ;fft zero padding factor (default 0 = none) dot-size ;if using dots, dot size in pixels line-size ;number of samples for line-oriented commands y-max ;y axis limit remember-state ;auto-save flag combine-channels ;combined channels flag auto-open ;should newly opened file view be normalized x-axis-style ;seconds, samples, etc speed-style ;speed control interpretation (0=float, 1=ratio, 2=semitones) speed-tones ;octave divisions for semitone calculation above initial-x0/x1/y0/y1 ;initial axis bounds when file is first read in ; if initial-x1 == 0, the full file is displayed xmax,xmin,ymax,ymin ;max axis settings movies ;update waveform as mix console moves mix-duration-brackets ;show mix segment extent mix-amp-scaler mix-speed-scaler mix-tempo-scaler overwrite-check ;overwriteCheck resource read-only ;sound-relative read-only flag auto-resize ;autoResize resource as variable filter-env-order ;FIR filter order used by envelope editor src-width ;sampling rate conversion data table width (default=10) env-clipping, env-graphing, env-style ;envelope editor toggle buttons (style: 0=amp, 1=spectrum, 2=srate) wavelet-choice ;change default wavelet setting (also transform-type) ;; the various control panel settings: expand-button contrast-button reverb-button filter-button amp speed contrast expand revscl revlen filter-order filter ;; associated, but undisplayed variables explen exprmp exphop revfb revlp contrast-amp revdecay follow-play ;; there are also global versions of some of these (prepend "global-") ;; color and orientation settings color-scale sono-max spectro-[xyz]angle spectro-[xyz]scl wavo-hop wavo-trace spectro-hop color-cutoff color-inverted spectro-color sono-color ;; raw (no header) file descriptions raw-srate raw-chans raw-format raw-defaults header-type ;; record window settings record-srate record-chans record-type record-format record-autoload record-digital record-line-panel record-out-panel record-mic-panel ;; and the 16 sliders record-[line|mic|out]-[a|b|aa|ab|bb|ba]The operations setf, setq, incf, and decf can be used to change these variables. 'cursor' refers to the position of the currently active cursor. 'window-height' and 'window-width' refer to the overall main Snd window. The 'x-axis-style' variable controls the ticks and labels on the x axis. The default (0) is to display seconds; x-axis-style of 1 displays samples, 2 displays the current window in terms of 0.0 to 1.0 (where 1.0 is the end of the file) -- a sort of percentage. The 'speed-style' variable controls interpretation of the control panel's srate slider: as a float (the default = 0), a small integer ratio (1) or a semitone (2). 'speed-tones' sets the number of equal divisions of the octave in the 'semitone' case (normally 12).
The spectrum data is usually normalized to fit between 0.0 to 1.0; if you'd rather have un-normalized data (the y-axis in this case changes to reflect the data values, to some extent), set the variable normalize-fft to 0.
In addition, if Snd is connected to an ACL version of CLM, any lisp expression can be typed to M-x; it will be sent to CLM and the result will be returned to Snd and printed in the minibuffer (if any). Such expressions can include such CLM calls as to-snd, so, for example, to run a CLM notelist and automatically open the result as a new sound all from the Snd minibuffer (as opposed to doing the same thing from the Lisp listener):
M-x (to-snd () (fm-violin 0 1 440 .10))This command runs with-sound with the given note, produces test.snd, or whatever, then opens that file in Snd.
As an example of an initialization file, say we always want the fft graph with its associated peaks displayed; and the file browser to default to listing only sound files; and any multichannel file to combine its channels into one graph. We create the file "~/.snd" and place in it:
(show-peaks) (show-fft) (just-sounds) (setf combine-channels 1)The peaks command opens a help window with the fft peak information, including the unscaled, linear amplitudes.
Saved State and Sessions
If you'd like Snd to start up in the state
you left it in upon last exiting (within reason), set the
variable remember-state to 1. This causes Snd to write
the .snd-backup file just before exiting; it will then
read that file the next time it is invoked if it doesn't
have any other arguments. At any time you can save the current
state of Snd by calling (session name)
where name
is a file name. You can start in this state by calling Snd
with this file name and the "-l" switch: snd -l name.
This is called a session file,
but it is in exactly the same format as the initialization
file discussed above, and can be edited, renamed, or
whatever. To load such a file after startup, use the
command load: M-x (load name)
.
initFile "~/.snd" backupFile ".snd-backup" epsFile "snd.eps" overwriteCheck 0 groups 6 autoResize 1 buttonFont -*-times-medium-r-*-*-14-*-*-*-*-*-iso8859-1 boldbuttonFont -*-times-bold-r-*-*-14-*-*-*-*-*-iso8859-1 axisLabelFont -*-times-medium-r-normal-*-20-*-*-*-*-*-iso8859-1 axisNumbersFont -*-courier-medium-r-normal-*-14-*-*-*-*-*-iso8859-1 helpTextFont 9x15 useSchemes none lightestcolor ivory1 basiccolor ivory2 darkcolor ivory3 darkestcolor ivory4 textcolor lightsteelblue1 cursorcolor cyan ! (in Linux: red) selectioncolor ivory4 mixercolor lightgreen groupcolor redYou can experiment with other choices by using the -xrm command line argument:
snd -xrm '*Lightestcolor: Red' oboe.snd snd -xrm '*AxisNumbersFont: 6x10' oboe.snd snd -xrm '*overwriteCheck: 1' oboe.snd snd -xrm '*useSchemes: all' -xrm '*scheme: Pacific' snd -xrm '*fontList: 9x15' oboe.sndThe color names can be found in /usr/lib/X11/rgb.txt. There's a list of widget names for Xresource files, now somewhat out-of-date, in the file snd-widgets.txt. If you use SGI color schemes, the color resources mentioned above are ignored. If overwriteCheck is 1, Snd asks before overwriting existing files. The AutoResize resource determines how Snd acts when files are added or removed from its overall display. The default (1) causes Snd to expand or contract the main window's size to accomodate the sounds; if autoResize is 0, the outer window size remains the same, and the sounds try to fit as best they can.
The interface is defined in snd-ufun.h; briefly, a user function is loaded via C-x C-l or the command (load-function library function). In both cases the arguments are unquoted. For example, the rms function in snd-ufunex.c can be loaded into Snd with:
C-x C-l sndlib.so,rmsOnce loaded, the function can be invoked with:
C-x C-h rmsand thereafter with C-h. If instead, you invoke the function with C-x C-y, the function will be called automatically thereafter each time the data in the channel window changes. This can be cancelled by giving a '-' argument to C-x C-y. Beware of setting up an automatic call to a function that edits the Snd data! To apply the function to the current selection, use C-x h or C-x y. Arguments can be passed to the user function:
C-x C-h a_func(4,3.14)See snd-ufunex.c if you're interested in writing one of these functions.