TweetFollow Us on Twitter

Sound 101
Volume Number:9
Issue Number:3
Column Tag:C Workshop

Related Info: Sound Manager

Sound 101

Evolution of the Mac voice

By Iggi Monahelis, Pleasanton, California

Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.

About the author

Iggi Monahelis is a programmer who bought his first Mac as soon as he could back in 1984. He is the principal designer and co-author of “Read My Lips”, the sound annotation utility for the Macintosh.

Introduction

This is an introductory article, hence the name Sound 101, dealing with basic recording and playback of sounds on the Macintosh. It explains the required steps to be taken in order to digitize sounds using a microphone, in two different sound formats, and play them back. It is a good stepping stone for someone who has little or no knowledge of how to do these things in a program on the Macintosh. As a matter of fact, one can probably copy the routines given in the article, and use them in their own program without a lot of modifications.

Ancient History

The Macintosh has had the capability of producing sounds since day one. The famous introduction of the Macintosh back in 1984 used sound, in the form of digitized speech, to allow the Mac to introduce itself. Inside Macintosh back then had a chapter on the Sound Driver with just a few routines, literally StartSound, StopSound and SoundDone, that allowed the programmer to control the Sound Driver. The Sound Driver produced sound using three different sound synthesizers:

1) the four-tone synthesizer, used to make simple harmonic tones, with up to four “voices” producing sound simultaneously. Hence the name four-tone.

2) the square-wave synthesizer, used to produce sounds such as beeps.

3) the free-form synthesizer, used to produce complex sounds, music and speech.

You had to “describe” the sound to the Driver as a waveform, basically fill a buffer with a bunch of numbers, and tell the Sound Driver to start producing noise based on these numbers. Very primitive.

Middle Ages

With the introduction of the Macintosh II class of machines, the Sound Driver had graduated to the Sound Manager. It was indeed a graduation because several innovations had taken place:

1) The hardware now included a new sound chip which freed the machine’s processor from doing all the work.

2) The introduction of sound resources. Sound resources can “contain” any sound you can imagine, from a simple beep sound to digital recordings of CD’s. And because they are resources, in the Macintosh sense of the word, you can work with them using standard Resource Manager calls. To play a sound resource all you have to do is load it and pass the handle to the resource to the SndPlay routine.

3) The Sound Manager now has seven routines to allow you to work with sound.

To produce sound, commands are sent to a synthesizer, as was the case with the Sound Driver. The Sound Manager uses a queue to send these commands to a synthesizer, these queues are called channels. To make complex sounds, many sounds may need to be produced simultaneously. For this reason several synthesizers can have multiple channels.

The new Sound Manager uses three synthesizers to produce sound:

1) the wave-table synth, lets you supply a wave table that describes the sound. This lets you produce more complex sounds, also it lets you play multiple sounds simultaneously by opening several channels. It corresponds to the old four-tone synth with four channels open.

2) the note synth, used to produce simple sounds, such as a note. The note synth can produce only one note at a time. It compares to the old square-wave synth from the Sound Driver.

3) the sampled sound synth, used to play digitally recorded sounds. In this case instead of passing the note or a wave table describing the sound you want played, you pass a buffer that contains samples of the sound to be played. This synth compares to the old free-form synth from the Sound Driver.

Despite the innovations that came with the Mac II and the graduation of the Sound Driver to a Manager, it was still difficult to digitize sounds using System software. It was easy once you had a sound resource to play it and several programs, mostly shareware, were created to play sound resources. Farallon came out with the MacRecorder® sound digitizer which allowed you to digitize sounds using the software that came with it, but still you could not do that in your own program without writing a lot of code yourself.

Today

With the introduction of the Macintosh IIsi and Macintosh LC, Apple for the first time included a built-in microphone with the Macintosh. System software versions 6.0.7 and later have a new and improved version of the Sound Manager. The Sound Manager chapter goes from 32 pages to 114 pages. This latest version introduces a whole slew of new features, some of which are:

1) There are now routines to record sounds using the built-in microphones, or any third party microphone with the appropriate driver for Macs that do not come with a microphone.

2) One can record either sound resources (‘snd ‘), or record directly to a file on disk in a format known as: Audio Interchange File Format (AIFF).

3) There are routines that allow for compressing and decompressing of sound data.

4) There are now routines that allow for the playing of sounds directly from disk. So one does not have to load all of the sound in memory in order to play it.

5) Customization galore. Besides the high-level routines for recording and playback there are low-level routines so that one could customize the way recording and playback is done.

Writing the program

It is always easier to start with a basic program, understand it, and then expand on it. The Sound 101 program is just such a program for learning the basics about recording and playing sounds. The program can record and play 'snd ' and AIFF sound files. It also allows for the selection of sound quality.

Here goes the code with explanations...

Sound101_main.c
/***********************************************************
© 1992 Praxitel, Inc. and Iggi Monahelis

This is the “main” for the Sound 101 project.  It has the minimum stuff 
to get a mac
program going.  Basically, it does all the required mac initializations, 
sets up the menu
bar, and then gets and processes events.

***********************************************************/
#include “Sound101.h”


extern int  gDestroyChannel;
extern SndChannelPtr gSndChan;
extern short     gFRefNum;
extern long gQuality;

/***********************************************************

main

This is the main routine for the Sound 101 application, it does all the 
Mac initializations.
Then calls the EventLoop procedure to get and process events.

***********************************************************/
void main(void)
{
 InitGraf((Ptr) &thePort );
 InitFonts();
 InitWindows();
 InitMenus();
 TEInit();
 InitDialogs(0L);
 InitCursor();
 
 MaxApplZone();
 SetUpMenus();

 EventLoop();    /* Do event processing until user quits */

}

/***********************************************************

SetUpMenus

Set up the menu bar for the Sound 101 application
 
***********************************************************/
void SetUpMenus(void)
{
 MenuHandle myMenu;
 
 myMenu = GetMenu(mApple);
 
 AddResMenu( myMenu, ‘DRVR’ );
 InsertMenu( myMenu, 0 );
 InsertMenu(GetMenu(mFile), 0) ;
 DrawMenuBar();
}

/***********************************************************

EventLoop

Event handling for the Sound 101 application.
Get events forever, and handle them by calling DoEvent.
 
***********************************************************/
void EventLoop(void)
{
 BooleangotEvent;
 EventRecordevent;

 do {
 gotEvent = WaitNextEvent(everyEvent, &event, 50, 0);
 if ( gotEvent ) {
 DoEvent(&event);
 }
 /* if we are done with the sound, dispose the sound 
    channel and close the sound file. */     
 if ( gDestroyChannel ) { 
 OSErr  myErr;
 
 InitCursor();
 if (gSndChan)
 myErr = SndDisposeChannel( gSndChan, TRUE);
 if (gFRefNum)
 myErr = FSClose(gFRefNum);
 /* make sure we do it only once! */
 gDestroyChannel = FALSE;
 gSndChan = 0;
 gFRefNum = 0;
 } 
 } while ( true ); /* loop forever */
} /*EventLoop*/

/***********************************************************

DoEvent

Determine the event type and dispatch accordingly
 
***********************************************************/
void DoEvent(EventRecord *event)
{
 short  part, err;
 WindowPtrwindow;
 char   key;

 switch ( event->what ) {
 case nullEvent:
 break;
 case mouseDown:
 part = FindWindow(event->where, &window);
 switch ( part ) {
 case inMenuBar:
 /* process a mouse menu command */
 DoMenuCommand(MenuSelect(event->where));
 break;
 case inSysWindow:
 /* let the system handle the mouseDown */
 SystemClick(event, window);
 break;
 case inContent:
 break;
 case inDrag:                
 break;
 case inGoAway:
 break;
 case inGrow:
 break;
 case inZoomIn:
 case inZoomOut:
 break;
 }
 break;
 case keyDown:
 case autoKey:
 /* check for menukey equivalents */
 key = event->message & charCodeMask;
 if ( event->modifiers & cmdKey ) {
 /* Command key down */
 /* if command-period was pressed, set our global
    to clean up the sound channel and close the
    open sound file. */
 if ( key == ‘.’ )
 /* command period was pressed */
 gDestroyChannel = TRUE;
 }
 break;
 case activateEvt:
 break;
 case updateEvt:
 break;
 }
} /*DoEvent*/

/***********************************************************

DoMenuCommand

Handles menu selections for the Sound 101 application
   
***********************************************************/
void DoMenuCommand(long menuResult)
{
 short  menuID, menuItem;
 short  itemHit, daRefNum;
 Str255 daName;

 menuID = HiWord(menuResult);
 menuItem = LoWord(menuResult);
 switch ( menuID ) {
 case mApple:
 switch ( menuItem ) {
 case iAbout: {  /* bring up the About box */
 OSErr  err;
 GrafPtroldPort;
 Rect   tempRect;
 DialogPtraboutDlg;
 
 GetPort(&oldPort);
 
 aboutDlg = GetNewDialog(128, nil, (WindowPtr) -1);
 if ( aboutDlg ) {
 /* Open a dialog box */
 ShowWindow(aboutDlg);    
 SelectWindow(aboutDlg);  /* Lets see it */
 SetPort(aboutDlg);
 while (TRUE) {
 ModalDialog(NULL, &itemHit);
 if ( itemHit == 1 )
 break;
 }
 DisposDialog(aboutDlg);
 SetPort(oldPort);
 }
 }
 break;

 default:
 /* all non-About items in this menu are DAs */
 GetItem(GetMHandle(mApple), menuItem, daName);
 daRefNum = OpenDeskAcc(daName);
 break;
 }
 break;
 
 case mFile:
 switch ( menuItem ) {
 case iPlaySound:
 PlayASound();
 break;
 case iRecordsndSound:
 Record_snd_resource(gQuality);
 break;
 case iRecordAIFFSound:
 Record_AIFF_sound(gQuality);
 break;
 case iQuality:
 GetQuality();
 break;
 case iQuit:
 Terminate();
 break;
 }
 break;
 } 
 
 /* unhighlight what MenuSelect (or MenuKey) hilited */
 HiliteMenu(0);  
}

/***********************************************************

Terminate

Quit the app
   
***********************************************************/
void Terminate(void)
{
 /* exit if no cancellation */
 ExitToShell();  
} /*Terminate*/
 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Latest Forum Discussions

See All

Top Mobile Game Discounts
Every day, we pick out a curated list of the best mobile discounts on the App Store and post them here. This list won't be comprehensive, but it every game on it is recommended. Feel free to check out the coverage we did on them in the links... | Read more »
Price of Glory unleashes its 1.4 Alpha u...
As much as we all probably dislike Maths as a subject, we do have to hand it to geometry for giving us the good old Hexgrid, home of some of the best strategy games. One such example, Price of Glory, has dropped its 1.4 Alpha update, stocked full... | Read more »
The SLC 2025 kicks off this month to cro...
Ever since the Solo Leveling: Arise Championship 2025 was announced, I have been looking forward to it. The promotional clip they released a month or two back showed crowds going absolutely nuts for the previous competitions, so imagine the... | Read more »
Dive into some early Magicpunk fun as Cr...
Excellent news for fans of steampunk and magic; the Precursor Test for Magicpunk MMORPG Crystal of Atlan opens today. This rather fancy way of saying beta test will remain open until March 5th and is available for PC - boo - and Android devices -... | Read more »
Prepare to get your mind melted as Evang...
If you are a fan of sci-fi shooters and incredibly weird, mind-bending anime series, then you are in for a treat, as Goddess of Victory: Nikke is gearing up for its second collaboration with Evangelion. We were also treated to an upcoming... | Read more »
Square Enix gives with one hand and slap...
We have something of a mixed bag coming over from Square Enix HQ today. Two of their mobile games are revelling in life with new events keeping them alive, whilst another has been thrown onto the ever-growing discard pile Square is building. I... | Read more »
Let the world burn as you have some fest...
It is time to leave the world burning once again as you take a much-needed break from that whole “hero” lark and enjoy some celebrations in Genshin Impact. Version 5.4, Moonlight Amidst Dreams, will see you in Inazuma to attend the Mikawa Flower... | Read more »
Full Moon Over the Abyssal Sea lands on...
Aether Gazer has announced its latest major update, and it is one of the loveliest event names I have ever heard. Full Moon Over the Abyssal Sea is an amazing name, and it comes loaded with two side stories, a new S-grade Modifier, and some fancy... | Read more »
Open your own eatery for all the forest...
Very important question; when you read the title Zoo Restaurant, do you also immediately think of running a restaurant in which you cook Zoo animals as the course? I will just assume yes. Anyway, come June 23rd we will all be able to start up our... | Read more »
Crystal of Atlan opens registration for...
Nuverse was prominently featured in the last month for all the wrong reasons with the USA TikTok debacle, but now it is putting all that behind it and preparing for the Crystal of Atlan beta test. Taking place between February 18th and March 5th,... | Read more »

Price Scanner via MacPrices.net

AT&T is offering a 65% discount on the ne...
AT&T is offering the new iPhone 16e for up to 65% off their monthly finance fee with 36-months of service. No trade-in is required. Discount is applied via monthly bill credits over the 36 month... Read more
Use this code to get a free iPhone 13 at Visi...
For a limited time, use code SWEETDEAL to get a free 128GB iPhone 13 Visible, Verizon’s low-cost wireless cell service, Visible. Deal is valid when you purchase the Visible+ annual plan. Free... Read more
M4 Mac minis on sale for $50-$80 off MSRP at...
B&H Photo has M4 Mac minis in stock and on sale right now for $50 to $80 off Apple’s MSRP, each including free 1-2 day shipping to most US addresses: – M4 Mac mini (16GB/256GB): $549, $50 off... Read more
Buy an iPhone 16 at Boost Mobile and get one...
Boost Mobile, an MVNO using AT&T and T-Mobile’s networks, is offering one year of free Unlimited service with the purchase of any iPhone 16. Purchase the iPhone at standard MSRP, and then choose... Read more
Get an iPhone 15 for only $299 at Boost Mobil...
Boost Mobile, an MVNO using AT&T and T-Mobile’s networks, is offering the 128GB iPhone 15 for $299.99 including service with their Unlimited Premium plan (50GB of premium data, $60/month), or $20... Read more
Unreal Mobile is offering $100 off any new iP...
Unreal Mobile, an MVNO using AT&T and T-Mobile’s networks, is offering a $100 discount on any new iPhone with service. This includes new iPhone 16 models as well as iPhone 15, 14, 13, and SE... Read more
Apple drops prices on clearance iPhone 14 mod...
With today’s introduction of the new iPhone 16e, Apple has discontinued the iPhone 14, 14 Pro, and SE. In response, Apple has dropped prices on unlocked, Certified Refurbished, iPhone 14 models to a... Read more
B&H has 16-inch M4 Max MacBook Pros on sa...
B&H Photo is offering a $360-$410 discount on new 16-inch MacBook Pros with M4 Max CPUs right now. B&H offers free 1-2 day shipping to most US addresses: – 16″ M4 Max MacBook Pro (36GB/1TB/... Read more
Amazon is offering a $100 discount on the M4...
Amazon has the M4 Pro Mac mini discounted $100 off MSRP right now. Shipping is free. Their price is the lowest currently available for this popular mini: – Mac mini M4 Pro (24GB/512GB): $1299, $100... Read more
B&H continues to offer $150-$220 discount...
B&H Photo has 14-inch M4 MacBook Pros on sale for $150-$220 off MSRP. B&H offers free 1-2 day shipping to most US addresses: – 14″ M4 MacBook Pro (16GB/512GB): $1449, $150 off MSRP – 14″ M4... Read more

Jobs Board

All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.