File: snd.txt

package info (click to toggle)
snd 3.4-4
  • links: PTS
  • area: main
  • in suites: potato
  • size: 5,148 kB
  • ctags: 12,594
  • sloc: ansic: 86,516; lisp: 3,480; sh: 1,507; makefile: 119
file content (1861 lines) | stat: -rw-r--r-- 91,729 bytes parent folder | download
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
                                 [S][n][d]

                 Bill Schottstaedt (bil@ccrma.stanford.edu)

                           [picture of Snd window]

  ------------------------------------------------------------------------

Snd is a sound editor modelled loosely after Emacs and an old, sorely-missed
PDP-10 sound editor named Dpysnd. It can accomodate any number of sounds at
once, each with any number of channels. Each channel is normally displayed
in its own window, with its own cursor, edit history, and marks; each sound
has a 'control panel' to try out various changes quickly, and an expression
parser, used mainly during searches; there is an overall stack of 'regions'
that can be browsed and edited; channels and sounds can be grouped together
during editing; edits can be undone and redone without restriction; Snd can
be customized and extended using C plugins, or Gnu Guile; and it's free; the
code is available via anonymous ftp from ccrma-ftp.stanford.edu as
pub/Lisp/snd.tar.gz.

  ------------------------------------------------------------------------

Contents

Getting Started
File Operations
     The Display
     Other Options
Editing
     The Active Channel and The Cursor
     Marks
     Regions
     The Edit List
     How to ...
     Keyboard Commands
The Control Panel
Customization and Extension
     Constants
     Variables
     Functions
     The initialization file
     Examples
Snd Resources
Runtime modules, plug-ins, external programs
     Dynamically loaded modules
     Plug-ins
     External Programs
Snd as a Widget
Index

  ------------------------------------------------------------------------

Getting Started

Once compiled and loaded (see README.Snd for instructions), fire Snd up with

  snd some.snd

where "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 Operations

  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 edits

Snd operates on sound files. When invoked, Snd scans its arguments for file
names, and opens any it finds.

  snd oboe.snd fyow.snd

If there are no arguments, Snd comes up as a bare menu bar. If a name is
preceded by "-p" or "-preload", 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 (scheme code, or a saved state
file for example) precede the file name with "-l" or "-load".

  snd oboe.snd -l examp.scm

opens the sound file oboe.snd and loads the Guile/Scheme code in examp.scm.

          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.

Normally Snd adds each new sound below those currently being displayed. To
position sounds horizontally (adding on the right), use the "-h" (or
"-horizontal") flag, or the horizontalPanes resource. (This only works on
systems with Motif 2.0 or later). Other overall layout choices include the
Notebook widget (horizontalPanes: 2, -notebook), an outer scroller widget
(horizontalPanes: 3, or -scroller), and separate windows for each sound
(-separate). These special choices need to be set either in the resource
file, or in the invocation line.

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 and corruption-time). If the
variable auto-update is 1 (default is 0), Snd automatically updates any such
file (this is also useful if you're editing the same file in two separate
panes).

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 initial extensions are snd, wav, aiff, aif, au, aifc, voc, and wve.
To add an extension to this list, use add-sound-file-extension.

Snd can handle the following file and data types:

read/write (many data formats):
     NeXT/Sun/DEC/AFsp
     AIFF/AIFC
     RIFF (Microsoft wave)
     IRCAM (old style)
     NIST-sphere
     no header
     ----
read-only (in selected data formats):
     8SVX (IFF), IRCAM Vax float, EBICSF, INRS, ESPS,
     SPPACK, ADC (OGI), AVR, VOC,
     Sound Tools, Turtle Beach SMP, SoundFont 2.0,
     Sound Designer I and II, PSION, MAUD, Kurzweil 2000,
     Tandy DeskMate, Gravis Ultrasound, ASF,
     Comdisco SPW, Goldwave sample, omf, quicktime
     Sonic Foundry, SBStudio II, Delusion digital,
     Digiplayer ST3, Farandole Composer WaveSample,
     Ultratracker WaveSample, Sample Dump exchange,
     Yamaha SY85, SY99, and TX16, Covox v8, SPL, AVI,
     ----
automatically translated to Sun 16-bit, then read/write:
     IEEE text, Mus10 SAM 16-bit (modes 1 and 4), IBM CVSD, AVI
     NIST shortpack, HCOM, Intel and Oki (Dialogic) ADPCM, MIDI sample dump
     G721, G723_24, G723_40, IFF Fibonacci and Exponential

'Linear' here means 2's complement integer. The files can have any number of
channels. Data can be either big or little endian. The default output type
is settable as the defaultOutputType resource. A raw data file gets its
srate, chans, and data format information either from the variables
raw-srate and friends (if raw-defaults == 1), or from a dialog window that
pops up when such a file is opened. The files listed as "automatically
translated" are decoded upon being opened, rewritten in Sun 16-bit format to
a new file with an added (possibly redundant) extension .snd, and that form
is the one the editor sees from then on.

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'. At the very bottom (or far right) of the Snd window is the
lisp listener, if any (see the View menu "Open listener" option). 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, in parentheses if the file is
actually a link, 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 (set-ask-before-overwrite 1)
in your Snd initialization file. If you edit a write-protected file and try
to save the edits, Snd will try to save the edits in a temporary file and
will post a warning that the current file could not be edited. A similar
sequence can occur when opening a file on a write-protected directory where
the sound file uses some compression scheme that Snd wants to translate
before editing.

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.

  ------------------------------------------------------------------------

The Display

  View Menu

    Show controls:    show/hide the control panel    (C-x C-o, C-x C-c)
    Normalize:        cleanup current Snd display
    Open listener:    show/hide lisp listener
    Channel style:    separate, combined or superimposed channels
    Graph style:      use dots, lines, or filled polygons 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 chooses color maps
    Orientation:      a browser that sets spectrogram and wavogram orientation
    Groups:           group editor (tracks for mixing)
    Show marks:       show or hide current marks
    Hide axes:        show or hide the x and y axes
    Show y=0:         show or hide the y=0 line
    X axis units:     x axis labelled in seconds, samples, percent of total
    Error History:    saved error messages

The file display can be modified in various ways. To use dots rather than
connected lines, use the Dots option in the View menu's Graph style option
(see also set-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. Similarly, to open or close the lisp
listener panel, use Open listener. 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 Popup menu's 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:

[picture of 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 Error History option displays whatever errors have been posted during
the current run of Snd. If some error gets erased too quickly from the
'minibuffer', you can recover it in this dialog.

The Regions option is described below.

  ------------------------------------------------------------------------

Other Options

  Options Menu

    Transform options: various transform choices
    Speed style:       control panel speed scrollbar interpretation
    Zoom style:        where to focus during zooms
    Save options:      save current state of options
    Save state:        save current state
    Show stats:        show disk and memory usage

The Options menu sets various preferences. The Transform Options menu
applies mainly to the FFT display triggered by setting the 'f' button in the
channel window. The dialog that is launched by this menu item has six
sections: on the upper left is a list of available transform types; next on
the right is a list of fft sizes; next is a panel of buttons that sets
various display-oriented choices; the lower left panel sets the current
wavelet, when relevant; next is the fft data window choice; and next to it
is a graph of the current fft window; when the window has an associated
parameter (sometimes known as "alpha" or "beta"), the slider beneath the
window list is highlighted and can be used to choose the desired member of
that family of windows.

The FFT is taken from the start (the left edge) of the current window and is
updated as the window bounds change. If you'd like the fft size to reflect
the current time domain window size:

(add-hook! graph-hook
           (lambda (snd chn y0 y1)
             (if (and (ffting) (= (fft-style) normal-fft))
                 (set-fft-size
                  (expt 2 (ceiling (/ (log (- (right-sample) (left-sample)))
                                      (log 2.0))))))))

The fft data is scaled to fit between 0.0 and 1.0 unless the fft
normalization is off. 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
spectro-cutoff). You can also click on any point in the fft to get the
associated fft data displayed; if verbose-cursor is on, you can drag the
mouse through the fft display and the description in the minibuffer will be
constantly updated.

The harmonic analysis function is normally the Fourier Transform, but others
are available, including about 20 wavelet choices, and autocorrelation.

The top three buttons in the transform dialog choose between a normal fft, a
sonogram, or a spectrogram. The "peaks" button affects whether peak info is
displayed alongside the graph of the spectrum. The "dB" button selects
between a linear and logarithmic Y (magnitude) axis. The "log freq" button
makes a similar choice along the frequency axis.

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, or Lisp
expressions. The keypad keys are mapped to various variables as follows:

    variable         increase           decrease
  spectro-cutoff    PageUp (9)          PageDown (3)
  spectro-hop       Add (+)             Subtract (-)
  spectro-z-angle   RightArrow (6)      LeftArrow (4)
  spectro-x-angle   Ctrl-UpArrow (8)    Ctrl-DownArrow (2)
  spectro-y-angle   Ctrl-RightArrow (6) Ctrl-LeftArrow (4)
  spectro-z-scale   UpArrow (8)         DownArrow (2)
  fft-size          Multiply (*)        Divide (/)
  dot-size          Delete (.)          Insert (0)

You can rotate the spectrogram around the various axes by holding down the
keypad and control keys. You can get arbitrarily small or large ffts with
the Multiply and Divide keys. The x and y axis scalers are named
spectro-x-scale and spectro-y-scale. The keypad Enter key resets all the
spectrogram variables to their default values. (In Linux, use the
corresponding numbered keys -- add shift to the key sequences given above).
See also the Color and Orientation menu options in the View menu.

[picture of sonogram]

If the choice of sizes in the fft size list doesn't include the one you
want, you can get arbitrarily small or large ffts with the Multiply and
Divide keys. The keypad Enter key resets all the spectrogram variables to
their default values. See also the fft-size variable. To interrupt a long
transform-related computation, deactivate the 'f' button.

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 M-x (set-wavo 1). 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.

The Save options menu option is best explained as a part of the
customization process described below. It basically sets up (or adds to) 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 Operations

  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)
    Select all:        select entire file (following sync state)
    Edit Envelope:     Edit or view envelopes
    Edit Header:       Edit or view file header

Editing 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. It ends 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

The Active Channel

The cursor (and its associated channel) is activated by clicking on the time
domain waveform. The active channel normally has a dark edge around the
graphics portion, as a sort of highlight. It is the window that receives
keyboard commands. You can also move between windows with C-x o (forwards or
backwards).

Moving the Cursor

Any mouse click on the waveform causes the cursor to move to that point. To
move the cursor from the keyboard, use:

  <      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 mark

All 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.

Moving the Window

The simplest way to move the window (the portion of the data in the current
graph) is to drag the scrollbars with the mouse. The darker scrollbars zoom
in and out; the lighter bars move the window along the x or y axis. Because
sound files can be enormous, the x axis placement needs some special
handling to make it useful in all cases. To move by a single windowful,
click the arrows on the scrollbar. To move by smaller amounts, use the left
and right arrow keys (or zoom with the up and down arrow keys); the control,
shift, and meta keys are multipliers on this movement -- each key adds a
factor of .5 to the multiple, so to move by .25 windows, press control,
meta, left (or right) arrow. A similar mechanism can be used to zoom quickly
onto a particular point; hold the keys and click the mouse in the waveform
and you'll zoom an increasing amount into the data at that point.

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.

  ------------------------------------------------------------------------

Marks

A mark marks a particular sample in a sound file (not a position in that
file). If we mark a sample, then delete 100 samples before it, the mark
follows the sample, changing its current position in the data. If we delete
the sample, the mark is also deleted; a subsequent undo that returns the
sample also returns its associated mark. I'm not sure this is the right
thing, but it's a lot less stupid than marking a position.

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 mark

The 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 via (save-marks).

  ------------------------------------------------------------------------

Regions

A region is a (saved) portion of the sound data. Although I'm not completely
consistent in this document, the word "selection" is used to refer to the
currently selected (and highlighted) portion of the data; an operation such
as filter-selection affects the underlying data. A "region" on the other
hand, refers to the saved (copied) version of that data that can be inserted
or mixed elsewhere. Regions can be defined by dragging the mouse through a
portion of the data. If the mouse drags off the end of the graph, the x axis
moves, in a sense dragging the data along to try to keep up with the mouse;
the further away the mouse is from the display, the faster the axis moves.
(One minor caveat: if you drag the mouse too quickly off the end of the
graph, making a grand sweeping gesture, the last portion of the graph may be
missed because the mouse updates are coalesced to some extent; move
deliberately as you near the end of the sound). A region can also be defined
with keyboard commands, much as in Emacs. C-[space] starts the region
definition and the various cursor moving commands continue the definition.

Once defined, the copied selection is added to a stack of currently
available regions (the stack size is normally 16 -- see max-regions). 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:

[picture of region browser]

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 'edit' button loads the region into
the main editor as a temporary file. It can be edited or renamed, etc. If
you save the file, the region is updated to reflect any edits you made.

The Select all menu option (in the Edit menu) uses the region mechanism as a
way to save the entire current sync'd state. Besides making it easier to
select an entire file (mouse event handling can make it tiresome to pick up
the last few samples sometimes), this option provides a quick way to save in
a temporary place the current edits applied to some file, channel, or group
thereof. You can then quickly return to this state later via the region
browser.

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
  C-x c       define selection from cursor to nth mark
  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 region (float arg = scaler)
  C-x w       save selection as file
  C-x x       evaluate expression over selection

  C-x l       position selection in mid-view
  C-x v       position window over current selection

If the current selection is active (displayed somewhere in the current time
domain displays), there are several functions that can edit that portion of
the current sounds (that is, the edit applies to the underlying sound, not
to the selection as a separate entity).

  scale-selection-by args
  scale-selection-to args
  src-selection num-or-env
  filter-selection coeffs order
  call-plug-selection plug
  reverse-selection
  env-selection env
  save-selection name type format srate comment
  convolve-selection-with filename amp
  smooth-selection

Also if the 'selection' button is set in the transform options dialog, (or
equivalently, show-selection-transform is #t or 1), the fft display, if any,
displays the transform of the selected portion. Save-selection is not always
the same as save-region with the region argument set to 0; a few functions,
such as reverse-selection, reverse the selected data, but leave the region
copy alone, so save-selection saves the reversed form, but save-region saves
the original version. This can be confusing if you use C-x p to play the
selection; it will actually play the original region, not the reversed form.

  ------------------------------------------------------------------------

The Edit List

The current state of the undo/redo list can be viewed as a scrolled list of
strings in the pane on the left of the graph (in Motif 1, there's a 'Show
Edit History' menu option). If there are no current edits, it just lists the
associated file name (i.e. the zero-edits state). As you edit the sound, the
operations appear in the edit list window. Click on a member of the list to
move to that point in the edit list (equivalent to some number of undo's or
redo's). To move to a given edit point and follow the sync chain (if any),
use control-click.

If Guile is loaded, the function save-edit-history saves the current edit
list as a loadable program (assuming the base sounds haven't changed in the
meantime). The file can be edited (it's just a text file with comments).
(more to come...)

  ------------------------------------------------------------------------

How to...

Save, open, close, print
Delete, insert, mix
Multi-channel operations
Amplitude envelopes and scaling
Find
Change samples
Undo, redo, revert
Play
Mix Files
Keyboard macros
Change file format
Extend a file
Record a file
Edit or view an envelope
Edit, add, or remove the header
Center a tiny signal with DC
Save state for later restart
Miscellaneous commands

Save, open, close, print

Most of these kinds of operations are accessible from the File menu. They
can also be invoked from the keyboard:

  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 file

The 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-h      delete previous sample
  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 region 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

Insertion takes place just ahead of the cursor; to insert after the cursor,
define a command something like:

  (bind-key (char->integer #\i) 0 "(insert-region (1+ (cursor)))")

Multi-channel operations

Normally each operation applies only to the currently active channel. If,
however, the sound's 'sync' button is set, the operations apply to every
sound or channel that also has the sync button set to the same value. If you
click the 'sync' button, its value is 1 and its color is blue; C-click gives
2 and green, C-M-click gives 3 and yellow; C-M-Shift-click gives 4 and red;
any other value (set via the set-syncing function) shows as a black button.
The point of all this is that only those sounds that share the sync value of
the current sound are considered to be sync'd to it; for example, to make a
stereo selection in one file, then paste it into some other stereo file, set
the sync buttons in each sound, but use different values; that way, the
channels within each sound are sync'd together (giving stereo operations),
but the sounds themselves are separate.

A multichannel sound also has a 'unite' button to the left of the 'sync'
button. If this button is set, all channels are displayed in one graph; the
x and y-axis scrollbars apply to all the channels at once, as do the 'f' and
'w' buttons; two new scrollbars appear on the right of the window; the
furthest right scrollbar affects the placement of the window within the
overall set of graphs, and the scrollbar on its left zooms in and out of the
overall graph. For stereo files, this is user-interface overkill, but the
hope is to accomodate sounds with many channels, making it easy to focus on
particular portions and so on. The View menu Channel style option has the
same effect but applies to all active multichannel sounds. Control-click the
unite button to get superimposed channels. If the channels are not combined
(the default), control-click the 'f' or 'w' button in one channel to affect
all channels at once.

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 list 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 to 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 channel

You can also specify an envelope name to the C-x C-a prompt.

To scale a file or selection by or to some amplitude, use the lisp
functions:

  scale-by args
  scale-to args
  scale-selection-by args
  scale-selection-to args

scale-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
either a piece of C-like code that describes which sample satisfies the
search, or the corresponding Scheme procedure. 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. Alternatively, we could use Scheme:
(lambda (y) (> y .1)). The Scheme procedure should be a function of one
argument, the current sample value; it should return #t when it reaches a
sample that satisfies the search criterion. 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 C-syntax includes most of C's operators,
the standard math library, as well as a few 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.
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 != y1

Or 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 functions are:

log log10 exp cos sin abs (i.e. fabs) pow sqrt
atan acos asin cosh sinh tanh fmod ceil floor

  y:             value at cursor (y(n) also)
  y1..8:         value ar cursor (y1(n)) in channel n (counting sounds from top)

The search commands are:

  C-r   find backwards
  C-s   find forwards

See also the functions find and count-matches, and the scanning and mapping
functions (Scanning Data).

Change samples

The simplest changes are:

  C-z       set current sample to zero
  C-x C-z   smooth data using cosine (smooth)

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. As with the 'find' commands, you can use
Scheme syntax here: the argument to C-x C-x should be a function of one
argument, the current sample value, and should return either #f (to leave
the value unchanged), or the new value. The example given above could also
be expressed as: C-x C-x (lambda (y) .1). To maintain local state across
function calls, you can use constructs such as:

(define filt
  (let ((y0 0.0))
    (lambda (x)
      (set! y0 (+ x (* .9 y0)))
      y0)))

Then C-u 1000 C-x C-x filt. But this can only be used once. A better version
might be:

(define filt
  (lambda ()
    (let ((y0 0.0))
      (lambda (x)
        (set! y0 (+ x (* .9 y0)))
        y0))))

C-u 1000 C-x C-x (filt). Now a subsequent (filt) call creates a new closure
(i.e. y0 starts again at 0.0).

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 - y2

In this particular case, a simpler way would be to scale the first by -1,
then mix in the second.

Undo, redo, revert

Snd supports 'unlimited undo' in the sense that you can move back and forth
in the list of edits without any obvious limit on how long that list can
get. The data displayed is always the edited form thereof. Each editing
operation extends the current edit list; each undo backs up in that list,
and each redo moves forward in the list of previously un-done edits. Besides
the Edit and Popup menu options, there are these keyboard commands:

  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 edit

Revert is the same as undoing all edits.

Play

To play a sound, click the 'play' button. If the sound has more channels
than your DAC(s), Snd will try to mix the extra channels into the available
DAC outputs. 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
'verbose cursor' is on, the time is also displayed in the minibuffer. 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 function clear-audio-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.

If you're getting interruptions while playing a sound (stereo 44.1 kHz
sounds can be problematic), try using a very large dac buffer. The function
that sets the dac buffer size is set-dac-size: M-x (set-dac-size 65536). If
you're getting clicks in Linux despite a large dac-size, try setting the OSS
fragment sizes by hand: set-oss-buffers(fragments,fragment-size). OSS's
defaults are 16 and 12; Snd's defaults are probably 4 and 12; the larger
these numbers, the more sluggish the control panel controls.

The keyboard commands for playing are:

  C-q    play current channel starting at the cursor
  C-t    stop playing
  C-x p  play region (numeric arg selects region)

In a multi-channel file, C-q plays all channels from the current channel's
cursor if the sync button is on, and otherwise plays only the current
channel. Except in the browsers, what is actually played depends on the
control panel. Both C-q and C-x p allow overlapped plays; that is, if you
type C-q several times in succession, you'll hear several simultaneous
renditions of the sound. The various 'play' buttons scattered around Snd on
the other hand, interrupt the current play if you click them during a run.
C-g stops any current playing.

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".

The Mix Console

When a section or file is mixed into the current file a mix console is
associated with it, each output channel getting its own console. The console
is displayed at first as a row of widgets giving the input file name, the
begin and end times of the mixed-in portion (click to change from seconds to
samples), then three icons:

  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

[picture of mix console]

You can drag the widgets to change the position of the mix. Once opened,
each console presents a pane with an amplitude slider for each input
channel, and a speed control (srate change on the input). The initial state
of the console sets the speed to 1.0, and all the input amplitudes 0.0
except the channel that matches the current output channel, which is set to
1.0 (a straight mix). To return to this state at any time, click the 'amp:'
label. To turn the mix off ('mute' it, set all amps to 0.0), double click
the label; to return to the last settings you made, click it with control or
meta down. Similarly, click the 'speed:' label to reset it to 1.0, and click
it with control or meta to return to your last settings. Each time you
release the mouse button (or click the amp label) counts as another 'edit'
of the file, so it is usually better to use 'undo' and 'redo' in this
context, rather than repeated clicks and shift-clicks. The srate scale is
interpreted in the same way as the sound pane speed control -- as a float
normally, but also, if you like, quantized to semitones or integer ratios.

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 range 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 a single letter, double click the file name.
Double click the label 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 label 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
setting its "anchor" to the position (sample) within the mix that should
correspond to the console's left edge. See mix-anchor.

To see the waveform of the sound being mixed, set the group editor "show mix
waveforms" button, or set the Snd variable show-mix-waveforms to 1. The
height of these graphs is set by mix-waveform-height. The mix waveform color
is set by the resource mixWaveColor.

Grouped Mixes

To tie together an arbitrary collection of mix consoles, use the 'group'
buttons in the upper right corner of the mixer. Any mixers that share a
button can be changed in parallel using the Group Editor (the Groups option
under the View menu). The group editor gives amplitude control over each
output channel that has a mix that is a member of the group. The speed
control affects the sampling rate, and the tempo control affects the spacing
of the individual members of the group. The play button plays just the group
members.

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.

Group Changes and Undo

Since a mix is viewed in Snd as just another edit which you can undo and
redo, and since one mix console can be participating in any number of
groups, and since any number of files can have these grouped mixes active at
once, and since you can ungroup a mix, then undo the related edit, it
becomes a bit of a pain to describe what each sequence of actions will do.
In general, think of a group as simply another kind of 'sync' button. The
Group Editor itself does not follow the undo/redo chains (edits in Snd are
considered to be local to each channel, but the group editor affects all
mixes together, possibly across many channels). Each change to a group
control immediately affects all mixes associated with that group, in each
case as a single edit of each participating channel. Each change to the mix
console takes into account the state of the groups that it is a member of.
Undo of any edit simply undoes the edit -- the mix console will back up one
state, but if the group controls have changed in the meantime, the two are
now out of sync. Similarly, if you remove a mix from a group, the group's
effect upon the mix is removed as well. If it joins a group with current
state, that causes an immediate change in the mixed portion's state. The
tempo control, however, only affects mixes that are under its control when
it is changed (does that make sense? -- the idea is that you might want to
leave a group briefly to fix a local mix position or speed, then rejoin the
group, but in that process you don't want the tempo control to cause the mix
to jump about randomly in time). Similar complications affect the group
envelopes. You can choose whether the envelope is applied over the entire
output duration, or just the group duration; in the latter case, you need to
be aware that adding or removing mixes can change that duration, changing
the effect of the envelope. Group state changes by themselves are not edits
(i.e. if a group has no members, undo and redo will not notice that you've
been fiddling with its amp scalers). If a mix is participating in several
groups, all associated groups affect the mix together (group states are
multiplied, and envelopes are "melded" into something resembling a gathering
of the various envelopes). If a mix is synced to others, and joins or leaves
a group, all the synced mixes follow its lead. All of this can be
summarized: groups act like the sync buttons. And if it's confusing,
consider the alternatives; or better, decide once and for all which mixes
are grouped together, and use only one group per mix. Then everything should
be "intuitive".

Keyboard macros

As in Emacs, C-x ( begins keyboard macro definition, C-x ) ends it, and C-x
e executes the last keyboard macro. Unlike Emacs, C-x C-e prompts for a name
for the last defined macro; M-x name invokes the macro "name", the function
save-macros saves all current named macros, and save-macro saves one (named)
macro in the initialization file (normally .snd). See the lisp section for
more details.

Change file format

To change the sound file's 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 (SGI and Linux shown below):

[picture of SGI Record window] [picture of Linux Record window]

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 in-coming 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. If the button is not square (a diamond
on the SGI), the underlying audio hardware can't handle input from that
device at the same time as it reads other "radio" button devices. So, in
that case, opening the panel via the button also turns off the other
incompatible device. The 'autoload' button, if set, causes the recorded file
to be loaded automatically into Snd.

The fifth pane 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. The default is to provide up to two channels of output; if you
want to write output files with more channels, set the recorder-out-chans
variable before invoking the recorder.

If the record window's VU meters are too big (or too small) for your screen,
you can fool around with the variable vu-size which defaults to 1.0.
Similarly the variable vu-font-size tries to change the size of the numbers
on the label, and vu-font chooses the family name of the font used (normally
"courier").

The description above is aimed at the SGI Indy; in other systems, the layout
may be different. In general, each separate pane reflects an independent
digital data stream; the vertical sliders on the right reflect various
hardware gains or tone controls that are applied before the signal gets to
the ADC, or in the case of output, after it has been read in, scaled, and
mixed into the output; in Linux the actual meaning of some of these sliders
is an industry secret, so some experimentation may be needed. The basic
signal flow can be viewed as coming in on the right of the input panels,
scaled in the sound card hardware by the vertical sliders, passed through
the ADC (if any), reflected in the VU meters, then scaled by the horizontal
sliders of the input panel, mixed into the output signal, scaled by its
horizontal sliders, reflected in its VU meters, then written to the output
file, while another copy passes out the right side of the output panel to
the speakers scaled by the output (vertical) sliders. The bizarre icon next
to the microphone in Linux is supposed to mean "line-in".

Sometimes it is more convenient to have the recorder start writing the
output file data only after some threshold amplitude has been reached. The
scale bar in the lower right marked "trigger:" sets this value. If it is 0.0
(the default), the recording begins as soon as you push the "Record" button.
Otherwise, the recording begins after you push "Record" and after the
triggered value is noticed in the output (modulo buffer crossings --
sometimes you'll get up to a buffer's worth of whatever preceded that
value). In this case, the button is labelled "Triggered Record".

          If there are so many input and output channels active
          that more than eight sliders would be needed in a given
          pane, the recorder tries to conserve tight screen space
          by showing only the direct cases, chan0 to chan0, chan1
          to chan1, and so on. It also posts a box of buttons to
          the left of the meters, each button representing a
          slider. If the button is on (green), the corresponding
          slider is displayed. Press one of the buttons to toggle
          whether its slider is displayed or hidden. It is also
          possible to drag the mouse through the box of buttons,
          setting (button 1) or unsetting (button 2) buttons as
          you go. Click in the corner (the '/' label) to set all
          (button 1) or unset all (button 2). Similarly, click
          above a column or to the left of a row to set (button 1)
          or unset (button 2) the entire column or row.
          Control-click in the corner to return to the default
          settings.

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'.

[picture of envelope editor]

Envelopes can be defined using defvar, and loaded from a separate file of
envelope definitions via load. 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. To interrupt
the application of the envelope, click the 'Stop' button. To apply the
changes to the current selection, rather than the current sound, set the
'selection' 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). The 'linear' and 'exp' buttons choose the type of connecting lines,
and the 'exp base' slider at the bottom sets the 'base' of the exponential
curves, just as in CLM. If the envelope is being treated as a spectrum
('flt' is selected), the 'wave' button shows the actual frequency response
of the filter that will be applied to the waveform by the 'apply' buttons.
Increase the filter-env-order to improve the fit. In this case, the X axis
goes from 0 Hz to half the sampling rate, labelled as "1.0".

Edit, add, or remove the header

The Edit menu's Edit Header option fires up a dialog to edit, add, or remove
the sound's header. No change is made to the actual sound data; the new
header is blindly written out; any unsaved edits are ignored. If you specify
'raw' as the type, any existing header is removed. This dialog is aimed at
adding or removing an entire header, or editing the header comments;
anything else is obviously dangerous. If you don't mess with the data
location, it will be updated to reflect any header changes; that is, unless
you intervene, the resultant header will be syntactically correct. After
writing the new header, you should either close or update the associated
sound.

Save state

At any time you can save the current state of Snd by calling (save-state
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 file is in
exactly the same format as the initialization file, and can be edited,
renamed, or whatever. To load such a file after startup, (load name) (C-x
C-l). Currently, mix consoles are not saved, but the associated edits are.

Center a tiny signal with DC

Due to the quantized nature of the y-axis position scroller, a tiny signal
that is not centered on 0 can be a pain to position in the window. Use the
set-y-bounds function to set the y axis bounds to some small number, then
use the position scroller to find the signal. For example, if your signal is
a very soft recording setting only the lowest two bits of a 16 bit signal
but with DC offset due to the recording conditions, M-x (set-y-axis -.01
.01) and try the scroller.

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.

To change a key binding, use bind-key.

As in Emacs or Tcsh, the Tab key in a text field invokes a context-sensitive
completion function that tries to figure out what the rest of the text
probably should be. If it finds no matches, the text flashes red; if it
finds multiple matches and can't extend the current text, it flashes green,
and (eventually) a list of possible completions appears in the help window.
If there is no completion routine active, Tab is a no-op (i.e. it doesn't
activate the "next" widget, as in the normal Motif program).

  ------------------------------------------------------------------------

Keyboard Commands

There are two types of keyboard commands in Snd: those associated with the
Meta ('Alt') key, used as mouse equivalents for various menu options, and
all the rest. The menu-related commands are shown underlined in the menubar.
You type the underlined letter with Meta, then just the letter (no Meta) of
the option you want. The menu-related commands are:

  ------------------------------------------------------------------------

 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 t: Transform Options  Click for help
M-f c: Close    M-e r: Redo            M-v n: Normalize             Speed style        Overview
M-f s: Save     M-e f: Find                   Open listener         Focus style        FFT
M-f a: Save as  M-e c: Cut             M-v c: Channel style  M-o a: Save options       Find
M-f r: Revert   M-e p: Paste           M-v d: Graph style           Save State         Undo and Redo
M-f m: Mix      M-e m: Mix Selection          Verbose cursor        Show stats         Sync
M-f u: Update   M-e p: Play Selection  M-v r: Regions                                  Speed
M-f n: New      M-e s: Save Selection  M-v b: Files                                    Expand
       Record          Select all             Color                                    Reverb
M-f v: View            Edit Envelope   M-v o: Orientation                              Contrast
M-f p: Print           Edit Header            Groups                                   Envelope
M-f x: Exit                            M-v m: Show marks                               Marks
                                              Hide axes                                Mixing
                                       M-v y: Show y=0                                 Formats
                                              Hide consoles                            Customization
                                              X axis units                             Recording
                                              Error History                            News

  ------------------------------------------------------------------------

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.

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:    delete previous sample
  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(s) 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
  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
  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-i:  insert file
  C-j:  go to mix console
  C-l:  load scm file
  C-m:  add named mark
  C-n:  re-evaluate expression
  C-o:  show ("open") controls
  C-p:  set (time domain display) 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 (time domain display) window size as percentage of total
  C-w:  save current channel in file
  C-x:  evaluate expression
  C-z:  smooth using cosine

  ------------------------------------------------------------------------

The Control Panel

The control panel is the portion of each sound's display beneath the channel
graphs. It is normally hidden, except for the upper portion that shows the
file name, the sync and play buttons, and the minibuffer (the portion in
between that opens into a text window when activated).

                       [picture of Snd control panel]

The controls are: amp, speed, expand, contrast, reverb, and filter.

'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, use src or the envelope editor. 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. 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 lowpass filter in the allpass bank (see below). 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 maximum amplitude,
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 (even) order FIR filter specified by giving the
frequency response envelope (the envelope is assumed to go from 0 to half
the sampling rate) and filter order in the text windows provided. If you
raise the control pane from its default height, a graph is revealed beneath
the filter text field; this is an envelope editor like the envelope editor
dialog but specialized for filtering. The actual frequency response is
displayed in blue. The filter is on only if the filter button is set.

There are many variables that reflect or control the panel's various
sliders; each also has a default or initial value. The reverb and expand
functions also have several aspects that aren't brought out to sliders or
buttons on the panel, but that can be accessed through these variables. See
the lisp section for details.

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 the reverb length setting, the controls can be changed as the
sound plays. You can record the (non-filter-related) 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 is added onto the end. Once Apply has taken effect, the
controls section is reset to its clean state (so a subsequent 'play' plays
the unmodified newly edited version). It is possible to use 'Apply' over the
current selection, or over the current channel (rather than the entire
sound); use C-x p (for the selection) or C-q (for the entire channel), then
'Apply'. In the selection case, this only works if the selection does not
span several sounds; the new data is truncated at the bounds of the current
selection. (This may be changed soon).

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

See also call-apply.

  ------------------------------------------------------------------------

Customization and Extension

See extsnd.html.

  ------------------------------------------------------------------------

Index

                                           Index

        Action           Menu       Keyboard          Lisp                  Other
 abort command                    Cg          abort?               mouse click

 amp env             Edit: Edit   Cx Ca, Cx a env-sound            scale-to, scale-by
                     Env
 auto-save                                                         examp.scm

 autocorrelation     Options:                                      examp.scm
                     Transform

 axis bounds                      Cx Cb, Cx   [xy]-bounds          -s switch to Snd
                                  Cp
 axis fits data                               fit-data-on-open     set-y-bounds
 brighten file                                                     see 'contrast' control
 center cursor                    Cl, Cv
 center selection                 Cx l
 center tiny signal                           set-y-bounds
 change colors                                make-color           resources

 change format       File: Save               save-sound-as
                     as
 change key binding                           bind-key

 change pitch        Edit: Edit               src-sound            see 'speed' control
                     Env
 change samples                   Cz, Cx Cz   set-samples          Cx Cx y=val

 change srate        Edit: Edit               src-sound            see 'speed' control
                     Env
 change tempo        View: Groups             set-expand           see 'expand' control
 close file          File: Close  Cx k        close-sound
 color               View: Color              color-dialog         color-scale,color-cutoff
                     View:
 combine channels    Channel                  channel-style
                     style
 compare files
 continue session                 Cx Cl       load                 -l switch to Snd

 control panel       View: Show   Cx Co, Cx   set-showing-controls drag pane sash
                     controls     Cc
 convolution                                  convolve             convolve-with
 count matches                                count-matches
 create new file     File: New                new-sound
 cut selection       Edit: Cut    Cw          cut
 define mark                      Cx /, Cx Cm add-mark             also Cm

 define selection    Edit: Select C[space],   make-region          mouse drag
                     All          Cx c
 delete mark                      - Cm        delete-mark          delete-marks
 delete samples      Edit: Cut    Cd, Ch, Ck  delete-samples
 describe audio                               describe-audio
 describe file       Popup: Info              info                 Edit: Edit Header
                     View:
 describe sample     Verbose      Ci          set-verbose-cursor
                     cursor

 dots or lines       View: Dots               graph-style          dot-size: numberpad '.',
                                                                   '0'

 edit env            Edit: Edit               enved-dialog
                     Env

 edit header         Edit: Edit               edit-header-dialog
                     Header

 evaluate expression              Cx Cx, Cx                        over region: Cx x, Cx n
                                  Cn

 examine regions     View:                    region-dialog
                     Regions

 exit Snd            File: Exit               exit                 window menu: close or
                                                                   exit
 extend file                      Co
 extract channel                  Cx Cw

 fft in dB           Options:                 fft-log-magnitude
                     Transform

 fft log freq        Options:                 fft-log-frequency
                     Transform

 fft normalization   Options:                 normalize-fft
                     Transform

 fft peaks           Options:                 show-fft-peaks       peaks
                     Transform

 fft size            Options:                 fft-size             fft-size: numberpad:
                     Transform                                     '*', '/'

 fft window          Options:                 fft-window
                     Transform

 fft window parameterOptions:                 fft-beta
                     Transform

 fft/sono/spectrogramOptions:                 fft-style
                     Transform

 file formats        File: Save               raw-format           defaultOutputType
                     as
 file lists          View: Files              file-dialog

 filter              Edit: Edit               filter-env           see filter controls
                     Env

 filter samples      Edit: Edit               filter-sound         filter-selection
                     Env
 find                Edit: Find   Cs or Cr    find                 count-matches
 horizontal panes                                                  -h switch to Snd
 insert file                      Cx Ci       insert-sound
 insert selection    Edit: Paste  Cy or Cx i  insert-region
 insert zeros                     Co, Cz      insert-samples
 interrupt Snd                    Cg          stop                 edit env
 keyboard macros                  C(, Cx e    key
 max amp                                      maxamp
 mix file            File: Mix    Cx Cq       mix
 mix selection       Edit: Mix    Cx q        mix-region
 move cursor ahead                Cf, Cn, Ce  forward-sample       also >
 move cursor back                 Cb, Cp, Ca  backward-sample      also <
 move mixed file                              set-mix-position     see mix doc
 move to mark                     Cj, Cx j    forward-mark         Cx j -> named mark
 move to mix                      Cx Cj       forward-mix

 move window ahead                [Left], Cx  set-right-sample     scroll bars
                                  f

 move window back                 [Right], Cx set-left-sample      scroll bars
                                  b
 multichannel ops                             syncing              sync button

 normalize display   View:                    normalize-view       Popup: Normalize
                     Normalize
 numeric arguments                Cu          prefix-arg           see marks as args
 open file           File: Open   Cx Cf       open-sound           Files dialog: click file
 open file read-only File: View               view-sound

 orientation         View:                    orientation-dialog
                     Orientation
 overwrite check                              ask-before-overwrite overwriteCheck
 play channel                     Cq, Ct      play

 play file           Popup: Play              play, stop           File or main window:
                                                                   'play'
 play selection      Edit: Play   Cx p        play-region
 plug-ins                                     call-plug            call-plug-selection
 preload directory                            preload-directory    -p switch to Snd
 print file          File: Print  Cx Cd       graph->ps            epsFile resource
 record sound        File: Record             recorder-dialog
 redo edit           Edit: Redo   Cx Cr       redo                 Popup: Redo

 resample            Edit: Edit               src-sound            src-selection
                     Env
 reverberate file                             convolve-with        see 'reverb' controls
 reverse samples                              reverse-sound        reverse-selection
 revert file         File: Revert             revert-sound
 save channel                     Cx Cw
 save control state                           control-panel-save   'save' button
 save file           File: Save   Cx Cs       save-sound           Popup: Save

 save file as        File: Save               save-sound-as        see also overwriteCheck
                     as
 save macros                                  save-macros
 save marks                                   save-marks

 save options        Options:                 save-options
                     Save options

 save selection      Edit: Save   Cx w        save-region          save-selection
                     selection

 save state          Options:                 save-state           save-state-on-exit
                     Save State
 select sound                     Cx o        select-sound         File dialog: click file

 show edit list      Edit: Show               show-edit-history
                     edit history
 show freq domain                             ffting               'f' button

 show marks          View: Show               set-show-marks
                     marks
 show time domain                             waving               'w' button
 smooth samples                   Cx Cz       smooth
 smooth selection                 Cx z        smooth-selection

 sonogram            Options:                 fft-style            colormap
                     Transform

 spectrogram         Options:                 fft-style            orientation, scaling
                     Transform

 speed units         Options:                 speed-style          speed-tones
                     Speed style

 srate conversion    Edit: Edit               src-sound            src-selection
                     Env
 temp directory                   Cx d        temp-dir             TMPDIR or /var/tmp
 tracking cursor                              cursor-follows-play  control click 'play'
 undo edit           Edit: Undo   C_ or Cx Cu undo                 Popup: Undo

 update file         File: Update [Home]      update               corruption-time,
                                                                   auto-update

 view envs           Edit: Edit               enved-dialog
                     Env

 wavelets            Options:                 wavelet-type
                     Transform
 wavogram                                     wavo                 wavo-trace, wavo-hop

 X axis units        View: X axis             x-axis-style
                     units

 y=0 line            View: Show               set-show-y-zero
                     y=0

 zoom focus          Options:                 set-zoom-focus-style
                     Zoom style
 zoom window                      [Up],[Down] set-x-bounds         control keys intensify