Apple II Technical Notes _____________________________________________________________________________ Developer Technical Support HyperCard IIGS #3: Pitching Sampled Sounds Written by: Mark Cecys & Matt Deatherage March 1991 This Technical Note describes the "relative pitch" field used in sound resources played by HyperCard (and sound scraps that HyperCard doesn't use)--what it does and what to put in it. _____________________________________________________________________________ What is this relative pitch thing? There are basically two ways to use a sound sample, in HyperCard or anywhere else: as a sample of a wave of definite pitch, or as a miniature "tape recording" of some sound that is not intended to be used as a sample of indefinite pitch. Definite Pitch To play a sample at the correct pitch, HyperCard assumes two things about the sample: it was sampled at a rate of 26.32 KHz, and the associated wave was playing a pitch of 261.63 Hz, when it was sampled. In the real world, where most of us live, this is not very practical. To help compensate for reality, the sample sound format includes a "relative pitch" field, which can tell HyperCard (or anyone else playing the sound) how to compensate for the difference in pitch between the sample's actual pitch and a pitch of 261.63 Hz. Follow these steps to calculate the relative pitch parameter for a given sampled sound resource. If the wave is of definite pitch, you must know the frequency of the source wave and the sampling rate for the sample in question. 1. Calculate the difference ratio r. In the equation below, Fw is the frequency of the sample (in Hz) and Fs is the sampling rate for the sample. 261.63 Fs r = ------ X ------ Fw 26,320 2. Extract an offset to the pitch: offset = 3072 X log (r) 2 (Remember that you can substitute (ln(r)/ln(2)) if your calculator doesn't provide the log in base 2.) 3. If offset is negative, make it positive and set bit 15 to tell sound players to lower the pitch instead of raise it. If offset is negative: relative = |offset| + $8000 If offset is positive: relative = offset That's all. Store the value of tuning in the sampled sound for the "relative pitch" field and HyperCard will take care of the rest. Indefinite pitch Sounds which are not samples of definite pitch (for example, a thunder clap or the sound of your mother saying "hello") should not need to be made to match pitch. Only sounds produced using optional parameters of HyperCard's Play command need to go through the same process outlined for "Definite pitch". In these cases, however, you don't need to worry about the frequency of the sample. Instead of using the equation provided in step 1 above, use this instead: Fs r = ------ 26,320 (or just use 261.63 for Fw.) Take the value of r and use it for steps two and three above. A HyperTalk sample The following simple button script will calculate the correct value of relativefor you, given the other values in card fields named Fw, Fs and card fields named offset and relativeto use as containers: on mouseUp lock screen set numberFormat to "0" put the value of card field Fs * 261.63 into r put the value of card field Fw into denominator -- the bottom of the fraction multiply denominator by 26320 divide r by denominator put log2(r) into card field offset multiply card field offset by 3072 if card field offset <0 then put abs(the value of card field offset) into card field tuning add 32768 to card field relative end if unlock screen end mouseUp Further Reference _____________________________________________________________________________ o HyperCard IIgs Script Language Guide o Apple IIgs Technical Note #76, Miscellaneous Resource Formats o Apple IIgs Technical Note #99, Supplemental Scrap Types