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

GarageSale 7.0.7 - Create outstanding eB...
GarageSale is a slick, full-featured client application for the eBay online auction system. Create and manage your auctions with ease. With GarageSale, you can create, edit, track, and manage... Read more
SpamSieve 2.9.28 - Robust spam filter fo...
SpamSieve is a robust spam filter for major email clients that uses powerful Bayesian spam filtering. SpamSieve understands what your spam looks like in order to block it all, but also learns what... Read more
Thunderbird 45.7.1 - Email client from M...
As of July 2012, Thunderbird has transitioned to a new governance model, with new features being developed by the broader free software and open source community, and security fixes and improvements... Read more
Opera 43.0.2442.991 - High-performance W...
Opera is a fast and secure browser trusted by millions of users. With the intuitive interface, Speed Dial and visual bookmarks for organizing favorite sites, news feature with fresh, relevant content... Read more
OnyX 3.2.4 - Maintenance and optimizatio...
OnyX is a multifunction utility that you can use to verify the startup disk and the structure of its system files, to run miscellaneous maintenance and cleaning tasks, to configure parameters in the... Read more
VueScan 9.5.71 - 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
Slack 2.5.1 - Collaborative communicatio...
Slack is a collaborative communication app that simplifies real-time messaging, archiving, and search for modern working teams. Version 2.5.1: New The way we load teams you don't view often has been... Read more
HandBrake 1.0.3 - Versatile video encode...
HandBrake is a tool for converting video from nearly any format to a selection of modern, widely supported codecs. Features Supported Sources VIDEO_TS folder, DVD image or real DVD (unencrypted... Read more
Vivaldi 1.7.735.46 - An advanced browser...
Vivaldi is a browser for our friends. In 1994, two programmers started working on a web browser. Our idea was to make a really fast browser, capable of running on limited hardware, keeping in mind... Read more
Vivaldi 1.7.735.46 - An advanced browser...
Vivaldi is a browser for our friends. In 1994, two programmers started working on a web browser. Our idea was to make a really fast browser, capable of running on limited hardware, keeping in mind... Read more

Last week on Pocket Gamer
If you’re wondering what’s going on in the wider world of portable gaming, our sister site PocketGamer has you covered. Each week we like to check in on the PG team and see what they’ve been preoccupied with. From the latest on the Nintendo Switch... | Read more »
Mudd Masher arrives this week
Atooi Games, the minds behind Totes the Goat and Mutant Mudds, have a new game in the works -- Mudd Masher. The game, a hybrid of the independent studio's first two titles, is expected to launch this week on March 2. [Read more] | Read more »
The best sales on the App Store this wee...
The App Store has quite an exciting lineup of discount games this week that range across a variety of genres. It's a great opportunity to catch up on some of the premium games you may have been holding off on -- and some you can even grab for free... | Read more »
The best new games we played this week
Ah, here we are again at the close of another busy week. Don't rest too easy, though. We had a lot of great new releases in mobile games this week, and now you're going to have to spend all weekend playing them. That shouldn't be too much of a... | Read more »
Rollercoaster Tycoon Touch Guide: How to...
| Read more »
Rabbids Crazy Rush Guide: How to unlock...
The Rabbids are back in a new endless running adventure, Rabbids Crazy Rush. It's more ridiculous cartoon craziness as you help the little furballs gather enough fuel (soda) to get to the moon. Sure, it's a silly idea, but everyone has dreams --... | Read more »
Tavern Guardians (Games)
Tavern Guardians 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: Tavern Guardians is a Hack-and-Slash action game played in the style of a match-three. You can experience high pace action... | Read more »
Slay your way to glory in idle RPG Endle...
It’s a golden age for idle games on the mobile market, and those addictive little clickers have a new best friend. South Korean developer Ekkorr released Endless Frontier last year, and players have been idling away the hours in the company of its... | Read more »
Tiny Striker: World Football Guide - How...
| Read more »
Good news everyone! Futurama: Worlds of...
Futurama is finding a new home on mobile in TinyCo and Fox Interactive's new game, Futurama: Worlds of Tomorrow. They're really doing it up, bringing on board Futurama creator Matt Groening along with the original cast and writers. TinyCo wants... | Read more »

Price Scanner via MacPrices.net

13-inch 2.7GHz Retina MacBook Pro on sale for...
B&H Photo has the 2015 13″ 2.7GHz/128GB Retina Apple MacBook Pro on sale for $150 off MSRP. Shipping is free, and B&H charges NY tax only: - 13″ 2.7GHz/128GB Retina MacBook Pro (MF839LL/A): $... Read more
13-inch 1.6GHz/256GB MacBook Air on sale for...
Newegg has the 13″ 1.6GHz/256GB MacBook Air (MMGG2LL/A) on sale for $1029.99 including free shipping. Their price is $170 off MSRP, and it’s the lowest price available for this model. Choose Newegg... 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
27-inch 3.3GHz 5K iMac on sale for $2099, sav...
B&H Photo has the 27″ 3.3GHz 5K Apple iMac on sale for $2099.99 including free shipping plus NY sales tax only. Their price is $200 off MSRP. Amazon also has the 27″ 3.3GHz 5K iMac on sale for $... Read more
21-inch iMacs on sale for up to $111 off MSRP
B&H Photo has select 21″ Apple iMacs on sale for up to $110 off MSRP, each including free shipping plus NY sales tax only: - 21″ 2.8GHz iMac: $1189 $110 off MSRP - 21″ 1.6GHz iMac: $999 $100 off... Read more
12-inch 1.2GHz Retina MacBooks on sale for $2...
Newegg has the 12″ 1.2GHz Space Gray Retina MacBook (sku MLH82LL/A) on sale for $1349.99 including free shipping. Their price is $250 off MSRP, and it’s the lowest price available for this model.... Read more
13-inch MacBook Airs on sale for $100 off MSR...
B&H Photo has 13″ MacBook Airs on sale for $100 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 13″ 1.6GHz/128GB MacBook Air (MMGF2LL/A): $899 $100 off MSRP - 13″ 1.6GHz/... Read more
9-inch 32GB Silver iPad Pro on sale for $549,...
B&H Photo has the 9.7″ 32GB Silver Apple iPad Pro on sale for $549 for a limited time. Shipping is free, and B&H charges NY sales tax only. Their price is $50 off standard MSRP for this model... Read more
13-inch 2.0GHz Apple MacBook Pros on sale for...
B&H has the non-Touch Bar 13″ 2.0GHz MacBook Pros in stock today and on sale for $100 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 13″ 2.0GHz MacBook Pro Space Gray (... Read more
15-inch Touch Bar MacBook Pros on sale for up...
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

Jobs Board

*Apple* Solutions Consultant - Apple (United...
# Apple Solutions Consultant Job Number: 55676865 Los Angeles, California, United States Posted: Feb. 22, 2017 Weekly Hours: 40.00 **Job Summary** As an Apple Read more
Programmer/Editor *Apple* Music Dance - App...
# Programmer/Editor Apple Music Dance Job Number: 55565967 Culver City, California, United States Posted: Feb. 23, 2017 Weekly Hours: **Job Summary** Apple Music Read more
Digital Marketing Specialist - *Apple* iClo...
# Digital Marketing Specialist - Apple iCloud Job Number: 54729233 Culver City, California, United States Posted: Feb. 22, 2017 Weekly Hours: 40.00 **Job Summary** Read more
Marketing Specialist, iTunes & *Apple*...
# Marketing Specialist, iTunes & Apple Music Job Number: 55704205 Culver City, California, United States Posted: Feb. 23, 2017 Weekly Hours: 40.00 **Job Summary** Read more
*Apple* Wireless Lead - T-ROC - The Retail O...
…of knowledge in wireless sales and activations to the Beautiful and NEW APPLE Experiencestore within MACYS. THIS role, APPLE Wireless Lead, isbrandnewas MACYS Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.