home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 91 / af091a.adf / af91a3.lzx / prgs / Sound / play.b next >
Text File  |  2018-01-21  |  4KB  |  208 lines

  1.   << play a sound file! >>
  2.  
  3.   Currently handles IFF 8SVX format.
  4.   If format is unknown, a default 
  5.   sampling rate is assumed. 
  6.  
  7.   USAGE 
  8.   -----
  9.   CLI/Shell:     Play [<file> [<sampling rate>]] | ?
  10.  
  11.   Author: David J Benn
  12.     Date: 6th,7th April,16th May,
  13.       30th June,
  14.       1st,3rd,4th,8th,28th July 1992,
  15.       6th,21st,25th January 1993,
  16.       3rd February 1993,
  17.       10th July 1993,
  18.       3rd January 1994,
  19.       20th March 1996
  20. }
  21.  
  22. declare function _Read&    library
  23.  
  24. longint offset&,samples_per_second&
  25. string  path$
  26.  
  27. SUB parse_sample(f$)
  28. shared offset&,samples_per_second&
  29. const default_rate=10000&
  30.  
  31.  { if IFF 8SVX sample, return
  32.    offset from start of file to
  33.    sample data and sampling rate in
  34.    samples per second. }
  35.  
  36.  open "I",1,f$
  37.  
  38.  '..skip FORM#### ?
  39.  dummy$=input$(8,#1)
  40.  
  41.  '..8SVX ?
  42.  x$=input$(4,#1)
  43.  if x$="8SVX" then
  44.    sample_format$="IFF 8SVX"
  45.  
  46.    '..skip VHDR###
  47.    dummy$=input$(8,#1)
  48.  
  49.    '..skip ULONGs x 3 
  50.    dummy$=input$(12,#1)
  51.  
  52.    '..get sampling rate bytes
  53.    hi%=asc(input$(1,#1))  '..high byte
  54.    lo%=asc(input$(1,#1))  '..low byte
  55.    samples_per_second&=hi%*256 + lo%
  56.  
  57.    '..find BODY
  58.  
  59.    '..skip rest of Voice8Header structure
  60.    dummy$=input$(6,#1)
  61.  
  62.    offset&=40  '..bytes up to this point
  63.    repeat 
  64.     repeat
  65.       x$=input$(1,#1)
  66.       offset&=offset&+1
  67.     until x$="B" and not eof(1)
  68.     if not eof(1) then
  69.       body$=input$(3,#1)
  70.       offset&=offset&+3
  71.     end if
  72.    until body$="ODY" and not eof(1) 
  73.  
  74.    if not eof(1) then
  75.      x$=input$(4,#1)  '..skip ####   
  76.      offset&=offset&+4
  77.    else
  78.      print "Error in file format!"
  79.      stop
  80.    end if
  81.    close 1
  82.  else
  83.    close 1
  84.    sample_format$="unknown"
  85.    offset&=0
  86.    if argcount<>2 then samples_per_second&=default_rate
  87.  end if
  88.  
  89.  '.. give info about sample
  90.  print "Sound file format is ";sample_format$;"."
  91.  
  92.  if sample_format$="unknown" then
  93.    if argcount<>2 then
  94.      print "Playback rate is";samples_per_second&;"Hz."
  95.    end if
  96.  else 
  97.    print "Sample was recorded at";samples_per_second&;"Hz."
  98.  end if
  99.  
  100. END SUB
  101.  
  102.  
  103. SUB play_sound(f$)
  104. shared offset&,samples_per_second&
  105. const maxsample=131070
  106. const channel=1
  107. const CHIP=0, MAXCHIP=2
  108.  
  109. dim   wave_ptr&(100)
  110.  
  111.  print 
  112.  print "*** ACE sound player ***"
  113.  
  114. '..file sample_size?
  115. open "I",1,f$
  116. sample_size&=lof(1)
  117. close 1
  118.  
  119. if sample_size&<>0 then
  120.   print f$;" contains";sample_size&;"bytes."
  121. else
  122.   print "Can't open ";f$;"."
  123.   stop
  124. end if
  125.  
  126. parse_sample(f$)
  127.  
  128. '..get the sample bytes
  129. buffer&=Alloc(sample_size&,CHIP) '...sample_size& bytes of CHIP RAM
  130. if buffer& = NULL then 
  131.   avail&=fre(MAXCHIP)  '..max. contiguous CHIP RAM
  132.   print "Largest contiguous CHIP RAM is";avail&;"bytes." 
  133.   stop
  134. end if
  135.  
  136. open "I",1,f$  
  137. fh&=handle(1)
  138. if fh&=0 then
  139.   print "Can't open ";f$;"."
  140.   stop 
  141. end if
  142. bytes&=_Read(fh&,buffer&,sample_size&)
  143. close 1
  144.  
  145. '..calculate period
  146. if argcount<>2 then 
  147.   per& = 3579546 \ samples_per_second&  
  148. else
  149.   sample_rate_requested&=clng(val(arg$(2)))
  150.   per& = 3579546 \ sample_rate_requested&
  151.   print "Requested sampling rate is";sample_rate_requested&;"Hz."
  152. end if
  153.   
  154. '...setup waveform table for voice 0
  155. sz&=sample_size&-offset&
  156.  
  157. if sz& <= maxsample then
  158.   '..play it in one go
  159.   wave channel,buffer&+offset&,sz&
  160.   dur&=.279365*per&*bytes&/1e6*18.2
  161.   sound per&,dur&,,channel
  162. else
  163.   segments&=sz&\maxsample
  164.   buf&=buffer&+offset&
  165.  
  166.   '..get the segment pointers
  167.   for i&=0 to segments&
  168.     wave_ptr&(i&)=buf&+maxsample*i&
  169.   next
  170.  
  171.   '..play sample in segments
  172.   for i&=0 to segments&
  173.     if sz& >= maxsample then 
  174.        wave channel,wave_ptr&(i&),maxsample 
  175.        bytes&=maxsample
  176.     else 
  177.        wave channel,wave_ptr&(i&),sz&
  178.        bytes&=sz&
  179.     end if
  180.     dur&=.279365*per&*bytes&/1e6*18.2
  181.     sound per&,dur&,,channel
  182.     sz&=sz&-maxsample
  183.   next   
  184. end if
  185.  
  186. END SUB
  187.  
  188.  
  189. { ** main ** }
  190.  
  191. if argcount=0 then
  192.   path$ = FileBox$("Choose a sound sample")
  193. else
  194.   if arg$(1)="?" then
  195.     print "usage: ";arg$(0);" [<file> [<sampling rate>]] | ?"
  196.     stop
  197.   else
  198.     path$ = arg$(1)
  199.   end if
  200. end if
  201.  
  202. if path$<>"" then 
  203.   play_sound(path$)
  204. else
  205.   dummy = MsgBox("No sound file selected.","OK")
  206. end if
  207.