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
$105.22
Apple Inc.
+0.39
MSFT
$46.13
Microsoft Corpora
+1.11
GOOG
$539.78
Google Inc.
-4.20

MacTech Search:
Community Search:

Software Updates via MacUpdate

OS X Server 4.0 - For OS X 10.10 Yosemit...
Designed for OS X and iOS devices, OS X Server makes it easy to share files, schedule meetings, synchronize contacts, develop software, host your own website, publish wikis, configure Mac, iPhone,... Read more
TotalFinder 1.6.12 - 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
BusyCal 2.6.3 - Powerful calendar app wi...
BusyCal is an award-winning desktop calendar that combines personal productivity features for individuals with powerful calendar sharing capabilities for families and workgroups. BusyCal's unique... Read more
calibre 2.7 - Complete e-library managem...
Calibre is a complete e-book library manager. Organize your collection, convert your books to multiple formats, and sync with all of your devices. Let Calibre be your multi-tasking digital... Read more
Skitch 2.7.3 - Take screenshots, annotat...
With Skitch, taking, annotating, and sharing screenshots or images is as fun as it is simple.Communicate and collaborate with images using Skitch and its intuitive, engaging drawing and annotating... Read more
Delicious Library 3.3.2 - Import, browse...
Delicious Library allows you to import, browse, and share all your books, movies, music, and video games with Delicious Library. Run your very own library from your home or office using our... Read more
Art Text 2.4.8 - Create high quality hea...
Art Text is an OS X application for creating high quality textual graphics, headings, logos, icons, Web site elements, and buttons. Thanks to multi-layer support, creating complex graphics is no... Read more
Live Interior 3D Pro 2.9.6 - Powerful an...
Live Interior 3D Pro is a powerful yet very intuitive interior designing application. View Video Tutorials It has every feature of Live Interior 3D Standard, plus some exclusive ones: Create multi... Read more
The Hit List 1.1.7 - Advanced reminder a...
The Hit List manages the daily chaos of your modern life. It's easy to learn - it's as easy as making lists. And it's powerful enough to let you plan, then forget, then act when the time is right.... Read more
jAlbum Pro 12.2.4 - Organize your digita...
jAlbum Pro has all the features you love in jAlbum, but comes with a commercial license. With jAlbum, you can create gorgeous custom photo galleries for the Web without writing a line of code!... Read more

Latest Forum Discussions

See All

Rami Ismail Opens Up distribute​() for D...
Rami Ismail Opens Up distribute​() for Developers Posted by Jessica Fisher on October 24th, 2014 [ permalink ] Rami Ismail, Chief Executive of Business and Development at indie game studio | Read more »
Great Hitman GO Goes on Sale and Gets Ne...
Great Hitman GO Goes on Sale and Gets New Update – Say That Three Times Fast Posted by Jessica Fisher on October 24th, 2014 [ permalink ] | Read more »
Rival Stars Basketball Review
Rival Stars Basketball Review By Jennifer Allen on October 24th, 2014 Our Rating: :: RESTRICTIVE BUT FUNUniversal App - Designed for iPhone and iPad Rival Stars Basketball is a fun mixture of basketball and card collecting but its... | Read more »
Rubicon Development Makes Over a Dozen o...
Rubicon Development Makes Over a Dozen of Their Games Free For This Weekend Only Posted by Jessica Fisher on October 24th, 2014 [ permalink ] | Read more »
I Am Dolphin Review
I Am Dolphin Review By Jennifer Allen on October 24th, 2014 Our Rating: :: NEARLY FIN-TASTICUniversal App - Designed for iPhone and iPad Swim around and eat nearly everything that moves in I Am Dolphin, a fun Ecco-ish kind of game... | Read more »
nPlayer looks to be the ultimate choice...
Developed by Newin Inc, nPlayer may seem like your standard video player – but is aiming to be the best in its field by providing high quality video play performance and support for a huge number of video formats and codecs. User reviews include... | Read more »
Fighting Fantasy: Caverns of the Snow Wi...
Fighting Fantasy: Caverns of the Snow Witch Review By Jennifer Allen on October 24th, 2014 Our Rating: :: CLASSY STORYTELLINGUniversal App - Designed for iPhone and iPad Fighting Fantasy: Caverns of the Snow Witch is a sterling... | Read more »
A Few Days Left (Games)
A Few Days Left 1.01 Device: iOS Universal Category: Games Price: $3.99, Version: 1.01 (iTunes) Description: Screenshots are in compliance to App Store's 4+ age rating! Please see App Preview for real game play! **Important: Make... | Read more »
Toca Boo (Education)
Toca Boo 1.0.2 Device: iOS Universal Category: Education Price: $2.99, Version: 1.0.2 (iTunes) Description: BOO! Did I scare you!? My name is Bonnie and my family loves to spook! Do you want to scare them back? Follow me and I'll... | Read more »
Intuon (Games)
Intuon 1.1 Device: iOS Universal Category: Games Price: $.99, Version: 1.1 (iTunes) Description: Join the battle with your intuition in a new hardcore game Intuon! How well do you trust your intuition? Can you find a needle in a... | Read more »

Price Scanner via MacPrices.net

Nimbus Note Cross=Platform Notes Utility
Nimbus Note will make sure you never forget or lose your valuable data again. Create and edit notes, save web pages, screenshots and any other type of data – and share it all with your friends and... Read more
NewerTech’s Snuglet Makes MagSafe 2 Power Con...
NewerTech has introduced the Snuglet, a precision-manufactured ring designed to sit inside your MagSafe 2 connector port, providing a more snug fit to prevent your power cable from unintentional... Read more
Apple Planning To Sacrifice Gross Margins To...
Digitimes Research’s Jim Hsiao says its analysts believe Apple is planning to sacrifice its gross margins to save its tablet business, which has recently fallen into decline. They project that Apple’... Read more
Who’s On Now? – First Instant-Connect Search...
It’s nighttime and your car has broken down on the side of the highway. You need a tow truck right away, so you open an app on your iPhone, search for the closest tow truck and send an instant... Read more
13-inch 2.5GHz MacBook Pro on sale for $949,...
Best Buy has the 13″ 2.5GHz MacBook Pro available for $949.99 on their online store. Choose free shipping or free instant local store pickup (if available). Their price is $150 off MSRP. Price is... Read more
Save up to $125 on Retina MacBook Pros
B&H Photo has the new 2014 13″ and 15″ Retina MacBook Pros on sale for up to $125 off MSRP. Shipping is free, and B&H charges NY sales tax only. They’ll also include free copies of Parallels... Read more
Apple refurbished Time Capsules available sta...
The Apple Store has certified refurbished Time Capsules available for up to $60 off MSRP. Apple’s one-year warranty is included with each Time Capsule, and shipping is free: - 2TB Time Capsule: $255... Read more
Textilus New Word, Notes and PDF Processor fo...
Textilus is new word-crunching, notes, and PDF processor designed exclusively for the iPad. I haven’t had time to thoroughly check it out yet, but it looks great and early reviews are positive.... Read more
WD My Passport Pro Bus-Powered Thunderbolt RA...
WD’s My Passport Pro RAID solution is powered by an integrated Thunderbolt cable for true portability and speeds as high as 233 MB/s. HighlightsOverviewSpecifications Transfer, Back Up And Edit In... Read more
Save with Best Buy’s College Student Deals
Take an additional $50 off all MacBooks and iMacs at Best Buy Online with their College Students Deals Savings, valid through November 1st. Anyone with a valid .EDU email address can take advantage... Read more

Jobs Board

*Apple* Solutions Consultant - Apple Inc. (U...
…important role that the ASC serves is that of providing an excellent Apple Customer Experience. Responsibilities include: * Promoting Apple products and solutions Read more
Senior Event Manager, *Apple* Retail Market...
…This senior level position is responsible for leading and imagining the Apple Retail Team's global event strategy. Delivering an overarching brand story; in-store, 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
Project Manager / Business Analyst, WW *Appl...
…a senior project manager / business analyst to work within our Worldwide Apple Fulfillment Operations and the Business Process Re-engineering team. This role will work Read more
*Apple* Retail - Multiple Positions (US) - A...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.