SOUND EDITOR v2.2 ================= June 25, 1995 THE SOUND EDITOR ---------------- To make the SoftDAC sound capability on 8-bit Apples more useful and fun, I wrote a sound editor which can load sounds up to 1.8 seconds long, play them, display them, and manipulate them in various useful ways. Version 2.2 extends the capabilities of the sound editor significantly, by supporting 2:1 compression of sounds to conserve disk space, and by allowing the sample rate (and therefore the pitch and duration) of sounds to be altered. The editor allows you to adjust the volume or pitch up or down on a whole sound or any sub-segment of a sound. You can also cut and paste between and within sounds, allowing editing and "Max Headroom" effects. THE DISPLAY ----------- The editor display is a mixed hi-res/text screen. The hi-res portion contains two "oscilloscope" displays which show the envelope of the sound. The upper display shows the whole sound file and has two "marks"--vertical lines which can be moved by the left and right arrow keys. Only one mark is "active" and can be moved at a time. The active mark flashes. The RETURN key makes the other mark active. The text part of the display is used to display the size and duration (in milliseconds) of the currently marked segment, the amount of space available for sound and the length of the last segment "cut", the current prefix, and the current compression mode. (It also hides the lower 32 lines of the hi-res screen, which contain the code for the software DAC!) EDITOR COMMAND SUMMARY ---------------------- Load & Save The L and S keys "load" and "save" sounds from/to disk. Load replaces the sound currently in memory with the new sound. Save saves the currently marked sub-segment of the sound to disk. You will be asked to provide the file name. Typing apostrophe (') followed by RETURN will produce a disk catalog for the current prefix. (When specifying a file name, you are free to provide a complete or relative path name.) If you press L or S accidentally, type just RETURN without a file name and the load or save operation will be cancelled. The type of file loaded or saved depends on the current "compression mode", displayed in the lower left of the text area. In "uncompressed mode", raw binary sound files are loaded and saved. In "compressed mode", files loaded or saved are in a 2:1 compressed form with ProDOS filetype $F2 ("User type 2"). The default mode is compressed mode. For more information on sound compression, see "COMPRESSION" below. Toggle Compression Mode The K key toggles between "compressed mode" and "uncompressed mode." This mode determines what kind of file will be loaded or saved. Move Active Mark The left and right arrow keys move the active (flashing) mark in the corresponding direction. The speed of movement is multiplied by ten if the open-Apple key is held down while an arrow key is pressed. After the marks are positioned, pressing a command key (say, the SPACE bar) updates the oscilloscope and text displays. Activate Other Mark The RETURN key activates the inactive mark and deactivates the active mark. The active mark is always flashing. Play The SPACE bar updates the lower oscilloscope display and the text display to reflect the current placement of the marks, then plays the marked segment. Set Prefix The / key allows you to set the current prefix. The initial prefix is "/sounds". If you type apostrophe (') followed by RETURN, a catalog of the subdirectories in the current subdirectory will be produced. If just RETURN is pressed, the set prefix operation will be cancelled. If the specified prefix starts with a "/", it is interpreted as a complete pathname. Otherwise, it is a relative prefix. If a relative prefix starts with a ".", the last element of the pathname will be removed before the new prefix is appended. A "." alone simply drops off the last element of the pathname. (I wish that ProDOS's PREFIX command worked this way!) It's no "SF.Get" (not enough space!) but you will find it's pretty easy to navigate. Both the current and the previous prefixes are saved, and can be "swapped" by the "$" command, below--this is, in some ways, handier than SF.Get! Swap Prefixes The $ key "$waps" (if you'll pardon the expression!) the current prefix and the previous prefix. This is particularly handy when you are editing sounds in one directory and saving them in another. Cut The C key (all command keys may be upper or lower case) "cuts" the currently marked sub-segment out of the sound and closes up the gap. The sound which was cut is saved in the "cut buffer", on /RAM disk. (If there is no /RAM volume when the editor is run, then the cut buffer will be saved at the current prefix.) The size of the cut buffer is displayed in the text area. Both marks are left at the point of the cut, so if you cut the wrong thing, just do a paste (see below) and everything will be as it was. Paste The P key "pastes" the contents of the cut buffer into the current sound at the location of the active marker, unless doing so would exceed the available space. The cut buffer can be pasted multiple times to produce various effects. The position of the marks after a paste permits it to be "undone" by performing a cut without moving the marks. The paste operation is aborted if nothing has been previously cut or if there is insufficient space to complete the paste. Adjust Volume The V key adjusts the "volume" of the current sub-segment by a factor which you supply. This can be used to "equalize" parts of a sound that were of very different amplitudes when they were sampled, or it can be used to set a sub-segment to silence by supplying a factor of zero. (This corrects a bug in earlier versions.) Pressing just RETURN will cause the volume adjust operation to be cancelled. The algorithm used to adjust volume is much faster than in earlier versions, so the "thermometer" display has been eliminated. Note that a series of volume adjustments may cause loss of information in the sound, such as clipping the peaks or losing bits of resolution. Although this can be used to produce some interesting effects, in general it results in loss of sound quality. Resample The R key is new in version 2. It "re-samples" the selected segment of a sound to 11025 Hz. from whatever sampling rate you input in samples per second. Resampling from rates other than 11025 Hz. is handy for changing the occasional non-11 kHz. sound to 11 kHz., but you will probably use it most for its effect of altering the pitch and duration of sounds or parts of sounds. For example, if you enter "11025" as the presumed rate, no change will occur, since 11025 samples per second is always the target rate. If you enter "8000", then additional samples will be interpolated to increase the size (and duration) of the sound by the ratio of 11025/8000, with a resulting decrease in pitch. If you enter a number of samples per second greater than 11025, then the size and duration of the segment will be decreased by the ratio 11025/, and the pitch of the sound will increase. Pressing just RETURN without entering a rate will cancel the resample operation. The resampling algorithm used is a simple interpolative scheme, not based on digital filtering. While the result is approximate, it is good enough for most purposes, and is very fast. (In fact, it operates at approximately the speed of a single 8-bit multiply per generated sample!) Resampling, particularly "down-sampling" from a higher frequency to 11025 Hz., does not, in general, conserve all the information in the original sound. As a result, down-sampling followed by up-sampling will cause a noticeable loss of high frequencies in the sound. Your best bet is to try to resample directly from the original sound at the desired frequency in a single step for best fidelity. Resampling at ratios less than 1:10 or greater than 10:1 is not permitted (nor is it very useful). Play with resampling to get a feel for what works--remember, no harm is done as long as you don't "save" over the original sound. You may find a great cannon shot in that sampled pistol shot! Help The ? key will display a help screen with abbreviated descriptions of the available commands. (Who am I kidding? They aren't "descriptions" so much as "reminders" of what the keys do!) Quit The Q key ends the program and quits to ProDOS. (If you would prefer to quit to Basic, just change SOUND.EDITOR by replacing 'PRINT D$"bye"' with 'END' in statement 840 (minus the single quotes, of course). COMPRESSION ----------- If you get interested in sounds, you will start collecting them. Soon you will notice how quickly sampled sounds can eat up disk space at 11025 bytes per second! Saving them with 2:1 compression provides substantial relief with negligible loss in sound quality. SOUND.EDITOR uses a fast, effective, "lossy" compression technology known as ADPCM (for Adaptive Differential Pulse Code Modulation--you can see why it's known as ADPCM!). The algorithm used is similar to the IIgs's ACE tool algorithm in concept and fidelity, but is much smaller and faster in implementation. It is derived from the 16-bit ADPCM algorithm proposed by Intel as a standard for DVI (Digital Video Interactive). The assembler source (COMP.S and DECOMP.S) are provided to encourage wider use of ADPCM in the 8-bit Apple world. (In addition to being very small and very fast, this algorithm has the advantage of being openly available, unlike the ACE tool algorithm.) The idea of ADPCM is straightforward: instead of encoding the actual value of each 8-bit sample, a 4-bit value is used to encode the difference between the previous reconstructed sample and the current sample. The differences are crammed into 4 bits by employing an implicit scale factor which varies adaptively as a function of previously encoded differences. The effect is a sliding scale of differences, so that when the input is changing slowly, the resolution of the encoded differences is a single unit, allowing perfect reconstruction. When the input changes more rapidly, larger differences are encoded with less resolution, so the reconstructed output may not be accurate in the low bits. Fortunately, the human ear is not very sensitive to small errors in large (loud) signals, so ADPCM permits 2:1 compression with practically inaudible error. The particular algorithm I used, like most well designed ADPCM algorithms, does not compound errors when used repeatedly. That is, although small errors are introduced when compressing a sound which was not previously compressed, subsequent decompression and recompression does not introduce any additional errors. (Put another way, the algorithm is lossless for any sounds it has decompressed.) The decompression routine fits on page 3 with room to spare, while the compression routine uses most of one page at $9000. Space is tight in SOUND.EDITOR, forcing this placement, but you can reassemble the sources to put them anywhere you like. (You can also combine the sources, eliminating a copy of a table.) For a number of convenience reasons, like selective "catalogs" and error detection, it's handy for compressed files to have a unique ProDOS type. Since types $F1 to $F8 are reserved as "user defined" file types, I somewhat arbitrarily picked type $F2 for SOUND.EDITOR ADPCM sound files. If it gets to be popular, then perhaps a more formal allocation will be appropriate. SOUND SOURCES Unfortunately, you can't (yet!) digitize sounds with more than 1 bit precisonn on an unaided Apple ][, but there are a wealth of 8-bit digitized sounds available in the IIgs and Mac worlds, and many can be easily downloaded from online services. Sound files of "binary" type can be played without further ado. Type $D8 ("SND") files can be played and edited if you change their type to binary and ignore (meaning "cut" off) the 64-byte headers on them. The SOUND.EDITOR loads, plays, and edits uncompressed binary or compressed "type $F2" files, and saves in either format. If the original sample rate is not 11 kHz. then things will sound faster or slower than intended. Most sounds are digitized at 11 kHz., but if you encounter sounds that sound too high-pitched or too fast, it was sampled at a lower rate than 11025 Hz., so resample it from a lower frequency (8000 Hz. is common in some quarters). If it sounds lower or slower than intended, resample from a higher frequency (the Mac world has a bunch of sounds sampled at 22050 Hz.). An annoying obstacle to accessing all the IIgs and Mac sounds is the use of compression formats for which there are no 8-bit Apple decompressors (such as the IIgs version of ShrinkIt). This problem arises when a "great" sound is embedded in a forked file. If you can find a way to de-archive the file, then the widely available program UNFORKIT can make (either) fork into a plain binary file, so its sound content can be used on 8-bit Apples. A program to decompress "ACE" files on 8-bit Apples would also be very useful, but, as I mentioned in the section on compression, documentation of the ACE algorithms and file formats is not (yet) available. GENERAL ------- I'd like to give special thanks to Steve Carpenter in Portland, Maine, for writing machine language display and volume adjusting routines for Version 1. The resulting speedup made the editor comfortably fast even when running on an unaccelerated Apple. His efforts inspired me to implement even faster routines for Version 2 and several powerful new features in machine language, although the basic framework of the editor is still in Applesoft. You may want to make modifications to SOUND.EDITOR to suit your purposes, but be careful. The entire Applesoft program must fit below the machine language routines at $1E00, which include hi-res screen 1 ($2000) and decompression and compression code which is moved to $300 and $9000. There are currently less than 100 bytes unused below $1E00. The program's once liberal comments have been savaged by the addition of new features, so it's getting harder to make space. Those of you who have examined earlier versions will also note that a number of changes have been made to save space, occasionally at the expense of clarity. Michael Mahon 1975 Adele Place San Jose, CA 95125 Internet: mjmahon@aol.com AOL: MJMahon Apple ][ forever!