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

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

WhiteCap 6.6 - Visual plug-in for iTunes...
WhiteCap is a sleek and sophisticated music visualizer and screensaver that features futuristic, wireframe mesh visuals with dynamic backgrounds and colors. WhiteCap contains thousands of visual... Read more
VOX 2.8.14 - Music player that supports...
VOX just sounds better! The beauty is in its simplicity, yet behind the minimal exterior lies a powerful music player with a ton of features and support for all audio formats you should ever need.... Read more
Paparazzi! 1.0b2 - Make user-defined siz...
Paparazzi! is a small utility for OS X that makes screenshots of webpages. This very simple tool takes screenshots of websites which do not fit on one screen. You specify the desired width, minimal... Read more
Carbon Copy Cloner 4.1.13 - Easy-to-use...
Carbon Copy Cloner backups are better than ordinary backups. Suppose the unthinkable happens while you're under deadline to finish a project: your Mac is unresponsive and all you hear is an ominous,... Read more
TrailRunner 3.8.832 - Route planning for...
TrailRunner is the perfect companion for runners, bikers, hikers, and all people wandering under the sky. Plan routes on a geographical map. Import GPS or workout recordings and journalize your... Read more
VueScan 9.5.65 - Scanner software with a...
VueScan is a scanning program that works with most high-quality flatbed and film scanners to produce scans that have excellent color fidelity and color balance. VueScan is easy to use, and has... Read more
Adobe Illustrator CC 2017 21.0.2 - Profe...
Illustrator CC 2017 is available as part of Adobe Creative Cloud for as little as $19.99/month (or $9.99/month if you're a previous Illustrator customer). Adobe Illustrator CC 2017 is the industry... Read more
iDefrag 5.1.7 - Disk defragmentation and...
iDefrag helps defragment and optimize your disk for improved performance. Features include: Supports HFS and HFS+ (Mac OS Extended). Supports case sensitive and journaled filesystems. Supports... Read more
Quicken 4.4.2 - Complete personal financ...
Quicken makes managing your money easier than ever. Whether paying bills, upgrading from Windows, enjoying more reliable downloads, or getting expert product help, Quicken's new and improved features... Read more
iDefrag 5.1.7 - Disk defragmentation and...
iDefrag helps defragment and optimize your disk for improved performance. Features include: Supports HFS and HFS+ (Mac OS Extended). Supports case sensitive and journaled filesystems. Supports... Read more

5 dastardly difficult roguelikes like th...
Edmund McMillen's popular roguelike creation The Binding of Isaac: Rebirth has finally crawled onto mobile devices. It's a grotesque dual-stick shooter that tosses you into an endless, procedurally generated basement as you, the pitiable Isaac,... | Read more »
Last week on PocketGamer
Welcome to a weekly feature looking back on the past seven days of coverage on our sister website, PocketGamer. It’s taken a while for 2017 to really get going, at least when it comes to the world of portable gaming. Thank goodness, then, for... | Read more »
ROME: Total War - Barbarian Invasion set...
To the delight of mobile strategy fans, Feral Interactive released ROME: Total War just a few months ago. Now the game's expansion, Barbarian Invasion is marching onto iPads as a standalone release. [Read more] | Read more »
Yuri (Games)
Yuri 1.0 Device: iOS iPhone Category: Games Price: $3.99, Version: 1.0 (iTunes) Description: It's night. Yuri opens his eyes. He wakes up in a strange forest.The small, courageous explorer rides on his bed on casters in this... | Read more »
Space schmup Xenoraid launches on the Ap...
10Tons Xenoraid is out today on the App Store, bringing some high-speed space action to your mobile gadgets just in time for the weekend. The company's last premium title, another sci-fi game titled Neon Chrome, did quite well for itself, so... | Read more »
Star Wars: Force Arena Beginner's G...
Star Wars: Force Arena joined the populous ranks of Star Wars games on mobile today. It's a two-lane MOBA starring many familiar faces from George Lucas's famed sci-fi franchise. As with most games of this nature, Force Arena can be a little obtuse... | Read more »
Mysterium: The Board Game (Games)
Mysterium: The Board Game 1.0 Device: iOS Universal Category: Games Price: $6.99, Version: 1.0 (iTunes) Description: The official adaptation of the famous board game Mysterium! | Read more »
Sonny (Games)
Sonny 1.0.4 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0.4 (iTunes) Description: Reimagined for iOS, cult-hit RPG Sonny brings challenging turn-based combat that requires strategy and mastery of each new skill to... | Read more »
Towaga (Games)
Towaga 1.0 Device: iOS iPhone Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: "It has been foretold that a masked being would stand atop the legendary Towaga Temple, dwelling among shadows to fulfil The Black Moon... | Read more »
Bubble Witch 3 Saga Guide: How to get th...
King's bringing its fairytale bubble-popping puzzler back for its 3rd outing in Bubble Witch 3 Saga. If you're familiar with the series, not much has changed here on the surface level, though you'll likely be pleased with the improvements. If you'... | Read more »

Price Scanner via MacPrices.net

New 2016 13-inch MacBook Pros on sale for up...
B&H Photo has the new 2016 13″ MacBook Pros in stock today and on sale for up to $150 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 13″ 2.9GHz/512GB Touch Bar MacBook Pro... Read more
New 15-inch Touch Bar MacBook Pros in stock a...
B&H Photo has the new 2016 15″ Apple Touch Bar MacBook Pros in stock today and on sale for up to $150 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 15″ 2.7GHz Touch Bar... Read more
Opera Announces Neon Concept Browser For Mac
Opera is inviting users to get a glimpse of what Opera for computers could become with its Opera Neon browser concept. Each Opera Neon feature is described as “an alternate reality” for the Opera... Read more
Tellini Releases TabView 3.0 Missing Tool fo...
Tellini has announced the release of TabView 3.0. TabView has been the first macOS viewer for PowerTab tablatures. PowerTab is a well-known and widely adopted tablature editor for Windows systems and... Read more
13-inch 1.6GHz/128GB MacBook Air on sale for...
Overstock.com has the 1.6GHz/128GB 13″ MacBook Air on sale for $130 off MSRP including free shipping: - 13″ 1.6GHz/128GB MacBook Air (MMGF2LL/A): $869.99 $130 off MSRP Their price is the lowest... Read more
12-inch 32GB Space Gray iPad Pro on sale for...
B&H Photo has 12″ Space Gray 32GB WiFi Apple iPad Pros on sale for $55 off MSRP including free shipping. B&H charges sales tax in NY only: - 12″ Space Gray 32GB WiFi iPad Pro: $744.44 $55 off... Read more
9-inch 32GB Space Gray iPad Pro on sale for $...
B&H Photo has the 9.7″ 32GB Space Gray Apple iPad Pro on sale for $549 for a limited time. Shipping is free, and B&H charges NY sales tax only. Read more
Apple iMacs on sale for up to $120 off MSRP,...
B&H Photo has 21″ and 27″ Apple iMacs on sale for up to $120 off MSRP, each including free shipping plus NY sales tax only: - 27″ 3.3GHz iMac 5K: $2199 $100 off MSRP - 27″ 3.2GHz/1TB Fusion iMac... Read more
Apple refurbished Apple TVs available for up...
Apple has Certified Refurbished 32GB and 64GB Apple TVs available for up to $30 off the cost of new models. Apple’s standard one-year warranty is included with each model, and shipping is free: -... Read more
1.4GHz Mac mini, refurbished, available for $...
The Apple Store has Apple Certified Refurbished 1.4GHz Mac minis available for $419. Apple’s one-year warranty is included, and shipping is free. Their price is $80 off MSRP, and it’s the lowest... Read more

Jobs Board

*Apple* Premier Retailer - Service Technicia...
DescriptionSimply Mac is the largest premier retailer for Apple products and solutions. At Simply Mac we are all Apple , all the time. Same products. Same prices. Read more
*Apple* Premier Retailer - Service Technicia...
DescriptionSimply Mac is the largest premier retailer for Apple products and solutions. At Simply Mac we are all Apple , all the time. Same products. Same prices. Read more
*Apple* Premier Retailer - Service Manager -...
DescriptionSimply Mac is the largest premier retailer for Apple products and solutions. At Simply Mac we are all Apple , all the time. Same products. Same prices. Read more
*Apple* Retail - Multiple Positions- Crows N...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* & PC Desktop Support Technician...
Apple & PC Desktop Support Technician job in Los Angeles, CA Introduction: We have immediate job openings for several Desktop Support Technicians with one of our Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.