TweetFollow Us on Twitter

Digitized Sound
Volume Number:6
Issue Number:5
Column Tag:Basic School

Related Info: Sound Manager

Playing Digitized Sound
in QuickBasic

By Robert Spencer, East Lyme, CT

Digitized Sound in QuickBasic

While Microsoft QuickBasic is my favorite language for getting things done quickly, it doesn’t have the power to produce applications as rich in Mac features as Pascal or C. Fortunately, Microsoft gives us the ability to add to the language with “pure code resources”, or MBPC’s, which can be added to QuickBasic itself and/or applications it creates. MBPC’s themselves must be written in Pascal or C, and compiled with the glue routines that QuickBasic needs. Once added to the resource fork of QuickBasic, an MBPC simply adds a new statement to the language. When this statement is encountered, control is passed to the compiled code. From my point of view this is a great way to work -- I get the quick turnaround time and comforting environment of an interpreter (it takes care of the user interface, memory management, printing, MultiFinder, DA’s, etc.), but when necessary for speed or language extension, I can write simple, short compiled routines.

In this article I use MBPC’s to demonstrate one of the things that you can’t do directly in QuickBasic: play digitized sound -- not just MacinTalk-like speech, but the high-quality music and voices that add so much pizzazz to HyperCard and games.

The QuickBasic manual and disks give examples for code resource writing with MPW Pascal, MPW C, and Lightspeed C. As Murphy’s Law would have it, my second language is THINK Pascal -- but fortunately the MPW Pascal glue routines supplied by Microsoft work without modification in THINK Pascal 2.0. The two MBPC resources shown below are SetSoundVol, which allows you to set the speaker volume from within QuickBasic, and PlaySound, which lets you play any digitized ‘snd ‘ resource (note the trailing space in ‘snd ‘). These new commands can be used in either interpreted or compiled Microsoft QuickBasic 1.0.

Changing the Speaker Volume

First is SetSoundVol, a minimal MBPC. The speaker volume could be changed without writing an MBPC, by using QuickBasic’s ToolBox command -- but it’s so simple that it’s a good starting example for MBPC programming.

The code (listing 1) is straightforward since there are only three lines that “do” anything. First, the glue routines GetNextLibArg and IntegerArg pass the desired sound volume (an integer 0,1,..,7) from QuickBasic, and then SetSoundVol(MyVolume) does the work. There is no error checking or trapping, so you should make sure the passed number is a legal value. Note also that the number can be passed by value or by name, since the routine doesn’t try to change it.

Build the project as shown in the SetVolume.Π project window. The DRVRRuntime.lib library is necessary for pure code resources; both it and Interface.lib come with THINK Pascal. BasicLib.a.o and BasicLibMPWP.p are the glue files for MPW Pascal that come with QuickBasic, and they link without modification under THINK Pascal. Finally, before compiling, fill in the Set Project Type... dialog for a Code Resource. This is shown for the PlaySound project; for SetSoundVol, just change the resource name to SetSoundVol and give it a different ID number. After compiling and linking, use ResEdit to copy SetSoundVol and then paste it into QuickBasic. If you don’t want to do this, or if you want to distribute a program to others who will use it under interpreted QuickBasic, you’ll have to include a LIBRARY statement in your Basic programs that refers to a separate file with SetSoundVol in its resource fork.

For a very simple demo of SetSoundVol, the following program is hard to beat:

'1

‘ SetSoundVol minimal demo
‘ Uncomment the LIBRARY command
‘ if you don’t insert the MBPC into QB
‘ LIBRARY MyMBPCFileName$
FOR i = 1 to 5
   SetSoundVol 1 : BEEP
   SetSoundVol 7 : BEEP
NEXT i
END

For a better demo, see listing 3, the QuickBasic program that demonstrates PlaySound, since it also uses SetSoundVol.

Playing Digitized Sounds

Playing digitized sounds isn’t difficult, but it’s significantly more complex than just changing the speaker volume, and I’m grateful for the guidance provided by MacTutor authors before me. In particular, Todd Carper’s 4th Dimension externals for playing sound (MacTutor 9, 42, and The Definitive MacTutor IV, 356-363) are in the same spirit as this QuickBasic MBPC (listing 2).

To keep things simple, let QuickBasic do as much of the work as possible. I assume that QuickBasic has opened the file(s) containing the ‘snd ‘ resources required (the System file and the current application are automatically opened), and I also let QuickBasic determine the ‘snd ‘ resource numbers. In the demo program I put all available sounds in a menu, so I use CountRes, GetIndRes, and GetResInfo. If you wanted a specific named snd, you could use GetNamedRes and GetResInfo to get the resource number. Note that these statements are part of the QuickBasic “Toolbox Library”, so be explicit in typing your integers% and longints&. The ratio% parameter should have a value of 1,2,3, or 4, depending on the sampling frequency used when the ‘snd ‘ was recorded (22, 11, 7.3, or 5.5 kHz, respectively). Essentially, ratio% just determines the playback speed ( 1 = fast, 4 = slow), and you can experiment with it to find out what speed is correct for a given snd. There’s no return parameter provided, so if there’s an error (e.g. a bogus resource number), then nothing happens -- simply no sound plays (Zen error handling?).

My favorite place to find unusual ‘snd ‘ resources is in HyperCard stacks. You can open the resource fork of a stack directly and look for snd’s there; for example, inserting

' 2

FileRef% = 0        ‘    initialize FileRef%
OpenResFile “hard disk:HyperCard folder:Sound Stack”,FileRef%

into the demo program would add the snd resources in hard disk:HyperCard folder:Sound Stack to the Sounds menu. If you have sound resources but they aren’t of type ‘snd ‘, the Boston Computer Society distributes a useful stack and associated tools to change digitized sounds from one type to another.

Have fun!

Rob Spencer is a biochemist at Pfizer Central Research, Groton, CT. He has a B.A. in physics, a Ph.D. in biochemistry, and is fortunate to be able to combine his avocation (Mac programming) with his vocation (finding and assaying new drugs to treat human disease). He can be reached at (203) 441-3946.

Figure 1. The ‘Set Project Type...’ dialog in THINK Pascal

Figure 2. SetVolume Project

listing 1 : SetVolume.p

UNIT SetVolume;
{   Called from QuickBasic as:    }
{   SetSoundVol vol%              }
{    where vol% = 0,1,...,7       }
INTERFACE
 USES
  BasicLib;
 PROCEDURE main;

IMPLEMENTATION

 PROCEDURE main;
  VAR
   tempflag, argtype, MyVolume: INT16;
   valptr: LIBARGPTR;
 BEGIN
  argtype := GetNextLibArg(valptr, tempflag);
  MyVolume := IntegerArg;
  SetSoundVol(MyVolume);
 END;
END.


Figure 3. The PlaySnd Project


listing 2: PlaySnd.p

UNIT PlaySoundUnit;
{   Called from QuickBASIC as:               }
{    CALL PlaySound (SndResNum%, ratio%)     }
{   in THINK Pascal by Rob Spencer   1/6/90  }

INTERFACE
 USES
  BasicLib;
 PROCEDURE Main;

IMPLEMENTATION

 PROCEDURE PlaySnd (SndResNum, Ratio: Integer);
{Thanks to Allan Wootton, The Complete MacTutor II, 230-235}
{and Todd Carper, The Definitive MacTutor IV, 356-363}
  TYPE
   FFSynthHandle = ^FFSynthPtr;
  VAR
   MySndHandle: FFSynthHandle;
   MyPtr: Ptr;
   MyFFPtr: FFSynthPtr;
   MyRatio: integer;

 BEGIN
  IF (Ratio > 0) AND (Ratio < 5) THEN
      { ratio must be 1..4 }
   MyRatio := Ratio
  ELSE
   MyRatio := 2;   { an arbitrary default }

  MySndHandle := FFSynthHandle(GetResource(‘snd ‘, SndResNum));
  IF MySndHandle <> NIL THEN
   BEGIN
   Hlock(Handle(MySndHandle));
   MyPtr := Ptr(MySndHandle^);
   MyFFPtr := FFSynthPtr(MyPtr);
   MyFFPtr^.mode := FFMode;
   MyFFPtr^.count := FixRatio(1, MyRatio);
   MyFFPtr^.wavebytes[0] := 0;
   StartSound(MyPtr, GetHandleSize(Handle(MySndHandle)) - 6, pointer(-1));
   StopSound;
   HUnlock(Handle(MySndHandle));
   DisposPtr(MyPtr);
   END;
 END;  { of PlaySnd }

 {------------------ main ------------------}
 PROCEDURE main;
  VAR
   tempflag, argtype: INT16;
   valptr: LIBARGPTR;
   SndResNum, ratio: integer;
 BEGIN
  argtype := GetNextLibArg(valptr, tempflag);
  SndResNum := IntegerArg;      { get argument 1 }
  argtype := GetNextLibArg(valptr, tempflag);
  ratio := IntegerArg;          { get argument 2 }
  PlaySnd(SndResNum, ratio);
 END;
END.

listing 3 : PlaySound Test Program

‘ PlaySound Test Program
‘ This QuickBASIC program will play ‘snd ‘
‘ resources from the resource fork of
‘ the application (either QB or itself if
‘ compiled) and the System file 
‘ (automatically opened).
‘ Rob Spencer      January 1990

GOSUB Initialize
WHILE NOT AllDone%      ‘   main event loop
   CheckEvent
WEND
dummy = FRE(-1)         ‘   compact the heap
END
‘_________________  subroutines ______________

Initialize:
   ‘   Uncomment the LIBRARY statement if the
   ‘   MBPCs SetSoundVol and PlaySound are in
   ‘   a separate MBPC file.
   ‘   LIBRARY MyMBPCLibName$
   DEFINT i-n
   ‘ use DIM SHARED to initialize variables
   ‘ as required by ToolBox Library statements
   DIM SHARED SndResNum%(21),handle&,NumSnds%
   DIM SHARED volume%,ratio%,dummy$,AllDone%,True%,False%
   False% = 0
   True% = NOT False%
   AllDone% = False%
   SndName$ = “”
   ‘   Uncomment the following to use a 
   ‘        separate snd file
   ‘   FileRef% = 0
   ‘   OpenResFile YourSndFileName$,FileRef%
   CountRes “snd “,NumSnds%
   ‘   limit to 20 items in a menu
   IF NumSnds%>20 THEN NumSnds% = 20

   ‘   set up menus
   
   MENU 1,0,1,”File”
   MENU 1,1,1,”Quit”
   CmdKey 1,1,”Q”
   
   MENU 3,0,1,”Sounds”
   FOR i% = 1 TO NumSnds%
      GetIndRes “snd “,i%,handle&
      GetResInfo handle&,SndResNum%(i%),dummy$,SndName$
      MENU 3,i%,1,SndName$
   NEXT i%
   
   MENU 4,0,1,”Volume”
   FOR i = 0 TO 7
      MENU 4,i+1,1,STR$(i)
   NEXT i
   
   MENU 5,0,1,”Compression”
   FOR i = 1 TO 4
      MENU 5,i,1,STR$(i)
   NEXT i
   
   MENU 6,0,1,”Combos”
   MENU 6,1,1,”random”
   
   ratio% = 2              ‘   set defaults
   MENU 5,2,2
   volume% = 5
   MENU 4,4,2
   SetSoundVol volume%

   dummy = FRE(-1)
   RETURN
   
SUB CheckEvent STATIC      ‘   only menu events
   MenuId% = MENU(0)
   ItemId% = MENU(1)
   SELECT CASE MenuId%
      CASE 1
         AllDone% = True%
      CASE 3
         PlaySound (SndResNum%(ItemId%)),(ratio%)
      CASE 4
         FOR i = 0 TO 7        ‘   uncheck all
            MENU 4,i+1,1
         NEXT i
         MENU 4,ItemId%,2      ‘   check ours
         volume% = ItemId%-1
         SetSoundVol (volume%)
      CASE 5
         ratio% = ItemId%
         FOR i = 1 TO 4        ‘   uncheck all
            MENU 5,i,1
         NEXT i
         MENU 5,ItemId%,2      ‘   check ours
      CASE 6
         FOR i% = 1 TO 10      ‘   play 10 snd ‘s  
            item% = NumSnds%*RND
            PlaySound (SndResNum%(item%)),(ratio%)
         NEXT i%
      CASE ELSE
   END SELECT
   IF MenuId%>0 THEN MENU MenuId%,0,1
   END SUB

 
AAPL
$98.38
Apple Inc.
-0.64
MSFT
$43.89
Microsoft Corpora
-0.09
GOOG
$585.61
Google Inc.
-4.99

MacTech Search:
Community Search:

Software Updates via MacUpdate

Drive Genius 3.2.4 - Powerful system uti...
Drive Genius is an OS X utility designed to provide unsurpassed storage management. Featuring an easy-to-use interface, Drive Genius is packed with powerful tools such as a drive optimizer, a... Read more
Vitamin-R 2.15 - Personal productivity t...
Vitamin-R creates the optimal conditions for your brain to work at its best by structuring your work into short bursts of distraction-free, highly focused activity alternating with opportunities for... Read more
Toast Titanium 12.0 - The ultimate media...
Toast Titanium goes way beyond the very basic burning in the Mac OS and iLife software, and sets the standard for burning CDs, DVDs, and now Blu-ray discs on the Mac. Create superior sounding audio... Read more
OS X Yosemite Wallpaper 1.0 - Desktop im...
OS X Yosemite Wallpaper is the gorgeous new background image for Apple's upcoming OS X 10.10 Yosemite. This wallpaper is available for all screen resolutions with a source file that measures 5,418... Read more
Acorn 4.4 - Bitmap image editor. (Demo)
Acorn is a new image editor built with one goal in mind - simplicity. Fast, easy, and fluid, Acorn provides the options you'll need without any overhead. Acorn feels right, and won't drain your bank... Read more
Bartender 1.2.20 - Organize your menu ba...
Bartender lets you organize your menu bar apps. Features: Lets you tidy your menu bar apps how you want. See your menu bar apps when you want. Hide the apps you need to run, but do not need to... Read more
TotalFinder 1.6.2 - Adds tabs, hotkeys,...
TotalFinder is a universally acclaimed navigational companion for your Mac. Enhance your Mac's Finder with features so smart and convenient, you won't believe you ever lived without them. Tab-based... Read more
Vienna 3.0.0 RC 2 :be5265e: - RSS and At...
Vienna is a freeware and Open-Source RSS/Atom newsreader with article storage and management via a SQLite database, written in Objective-C and Cocoa, for the OS X operating system. It provides... Read more
VLC Media Player 2.1.5 - Popular multime...
VLC Media Player is a highly portable multimedia player for various audio and video formats (MPEG-1, MPEG-2, MPEG-4, DivX, MP3, OGG, ...) as well as DVDs, VCDs, and various streaming protocols. It... Read more
Default Folder X 4.6.7 - Enhances Open a...
Default Folder X attaches a toolbar to the right side of the Open and Save dialogs in any OS X-native application. The toolbar gives you fast access to various folders and commands. You just click... Read more

Latest Forum Discussions

See All

Note Review
Note Review By Jennifer Allen on July 29th, 2014 Our Rating: :: TOO SIMPLEiPhone App - Designed for the iPhone, compatible with the iPad Note is a note taking app that’s a little too short on features to be worth its asking price... | Read more »
Chainsaw Warrior Goes on Sale & Ther...
Chainsaw Warrior Goes on Sale & There’s a Chance to Win a Copy of the Original Board Game Posted by Jennifer Allen on July 29th, 2014 [ permalink | Read more »
It Came From Canada: Tiny Tower Vegas
If you go to a casino, you might make a lot of money. If you run a casino, you’re guaranteed to make a lot of money. The choice seems pretty obvious. So while waiting for your shady real estate deals to move forward, get prepared with Tiny Tower... | Read more »
Z Hunter Review
Z Hunter Review By Lee Hamlet on July 29th, 2014 Our Rating: :: RIGHT ON TARGETUniversal App - Designed for iPhone and iPad While it might not necessarily break new ground, Z Hunter has enough tricks up its sleeve to ensure that... | Read more »
Huge Update Comes To Duet, Adding 48 New...
Huge Update Comes To Duet, Adding 48 New Stages Posted by Jennifer Allen on July 29th, 2014 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
Sharknado: The Video Game Available Now....
Sharknado: The Video Game Available Now. Seriously. Posted by Rob Rich on July 29th, 2014 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
Frog Orbs 2 Review
Frog Orbs 2 Review By Nadia Oxford on July 29th, 2014 Our Rating: :: THIS MAGIC IS A TAD MONOTONOUS Universal App - Designed for iPhone and iPad Frog Orbs 2 is repetitive, but younger players should enjoy it nonetheless.   | Read more »
Puzzix Review
Puzzix Review By Jennifer Allen on July 29th, 2014 Our Rating: :: NICE IDEAUniversal App - Designed for iPhone and iPad A little like Tetris, Puzzix is all about piecing together blocks and watching them vanish. It could do with... | Read more »
Cannonball eMail is Now Live – Works Wit...
Cannonball eMail is Now Live – Works With Gmail, Yahoo, Outlook, Hotmail, and AOL Posted by Jessica Fisher on July 29th, 2014 [ permalink ] | Read more »
To The End Review
To The End Review By Lee Hamlet on July 29th, 2014 Our Rating: :: A VICIOUS CYCLEUniversal App - Designed for iPhone and iPad To The End will test players’ patience, timing, and dedication as they try to navigate all 13 levels in... | Read more »

Price Scanner via MacPrices.net

The lowest prices on leftover Retina MacBook...
Best Buy has dropped prices on leftover 13″ and 15″ Retina MacBook Pros by up to $300 off original MSRP on their online store for a limited time. Choose free local store pickup (if available) or free... Read more
Apple Updates MacBook Pro with Retina Display...
Apple today updated its MacBook Pro with Retina display with faster processors and double the amount of memory in both entry-level configurations. MacBook Pro with Retina display features a Retina... Read more
Up to $250 price drop on leftover 15-inch Mac...
B&H Photo has dropped prices on 2013 15″ Retina MacBook Pros by as much as $250 off original MSRP. Shipping is free, and B&H charges NY sales tax only: - 15″ 2.3GHz Retina MacBook Pro: $2349... Read more
Updated MacBook Pro Price Trackers
We’ve updated our MacBook Pro Price Trackers with the latest information on prices, bundles, and availability on the new 2014 models from Apple’s authorized internet/catalog resellers as well as... Read more
Apple updates MacBook Pros with slightly fast...
Apple updated 13″ and 15″ Retina MacBook Pros today with slightly faster Haswell processors. 13″ models now ship with 8GB of RAM standard, while 15″ MacBook Pros ship with 16GB across the board. Most... Read more
Apple drops price on 13″ 2.5GHz MacBook Pro b...
The Apple Store has dropped their price for the 13″ 2.5GHz MacBook Pro by $100 to $1099 including free shipping. Read more
Apple drops prices on refurbished 2013 MacBoo...
The Apple Store has dropped prices on Apple Certified Refurbished 13″ and 15″ 2013 MacBook Pros, with model now available starting at $929. Apple’s one-year warranty is standard, and shipping is free... Read more
iOS 8 and OS X 10.10 To Support DuckDuckGo As...
Writing for Quartz, Dan Frommer reports that Apple’s forthcoming iOS 8 and OS X 10.10 operating systems version updates will allow users to select DuckDuckGo as their default search engine. He notes... Read more
U.K. Hospital Using iPods and iPads To Record...
British news journal GazetteLive’s. Ian McNeal notes that the old “an apple a day keeps the doctor away” proverb is being turned on its head at http://southtees.nhs.uk/hospitals/james-cook/ James... Read more
13-inch 2.5GHz MacBook Pro on sale for $1099,...
Best Buy has the 13″ 2.5GHz MacBook Pro available for $1099.99 on their online store. Choose free shipping or free instant local store pickup (if available). Their price is $100 off MSRP. Price is... Read more

Jobs Board

Sr Software Lead Engineer, *Apple* Online S...
Sr Software Lead Engineer, Apple Online Store Publishing Systems Keywords: Company: Apple Job Code: E3PCAK8MgYYkw Location (City or ZIP): Santa Clara Status: Full Read more
*Apple* Solutions Consultant (ASC) - Apple (...
**Job Summary** The ASC is an Apple employee who serves as an Apple brand ambassador and influencer in a Reseller's store. The ASC's role is to grow Apple Read more
Sr. Product Leader, *Apple* Store Apps - Ap...
**Job Summary** Imagine what you could do here. At Apple , great ideas have a way of becoming great products, services, and customer experiences very quickly. Bring Read more
*Apple* Solutions Consultant (ASC) - Apple (...
**Job Summary** The ASC is an Apple employee who serves as an Apple brand ambassador and influencer in a Reseller's store. The ASC's role is to grow Apple Read more
*Apple* Solutions Consultant (ASC) - Apple (...
**Job Summary** The ASC is an Apple employee who serves as an Apple brand ambassador and influencer in a Reseller's store. The ASC's role is to grow Apple Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.