Play recorded sounds: Difference between revisions

From Rosetta Code
Content added Content deleted
(add Ruby)
(omit m4)
Line 143: Line 143:
cat $1 >> /dev/audio # Write file $1 to the speaker's Character Special (/dev/audio).
cat $1 >> /dev/audio # Write file $1 to the speaker's Character Special (/dev/audio).
</lang>
</lang>

{{omit from|M4}}

Revision as of 01:44, 5 September 2009

Task
Play recorded sounds
You are encouraged to solve this task according to the task description, using any language you may know.

Load at least two prerecorded sounds, and demonstrate as many of these features as you can:

  • playing them individually and simultaneously
  • stopping before the end of the sound
  • looping (preferably glitch-free)
  • setting the volume of each sound
  • stereo or 3D positional mixing
  • performing other actions when marked times in the sound arrive

Describe:

  • The supported audio formats, briefly.
  • Whether it is suitable for game sound effects (low-latency start, resource efficiency, supports many simultaneous sounds, etc.)
  • Whether it is suitable for playing music (long duration ).

[Note: If it seems to be a good idea, this task may be revised to specify a particular timeline rather than just 'demonstrate these features'.]

Where applicable, please categorize examples primarily by the audio facility used (library/API/program/platform) rather than the language if the language is incidental (e.g. "Mac OS X CoreAudio" or "mplayer" rather than "C" or "bash").

AutoHotkey

No builtin functions for:
1. monitoring timepoints in the sound
2. simultaneous play <lang AutoHotkey> SoundPlay, %A_WinDir%\Media\tada.wav, wait SoundPlay, %A_WinDir%\Media\Windows XP Startup.wav, wait

simulaneous play may require a second script

SoundPlay, %A_WinDir%\Media\tada.wav SoundPlay, Nonexistent  ; stop before finishing

SoundSet +10  ; increase volume by 10% Loop, 2

   SoundPlay, %A_WinDir%\Media\tada.wav, wait

</lang>

C#

<lang csharp>using System; using System.Threading; using System.Media;

class Program {

   static void Main(string[] args)
   {
       //load sound file
       SoundPlayer s1 = new SoundPlayer(); //
       s1.SoundLocation = file; // or "s1 = new SoundPlyer(file)"
       //play
       s1.Play();     
       //play for 0.1 seconds
       s1.Play();
       Thread.Sleep(100);
       s1.Stop();
       //loops
       s1.PlayLooping();
   }

}</lang>

Ruby

There aren't many mature sound libraries for Ruby. The

Library: RubyGems

package win32-sound can play WAV files on the Windows platform only.

<lang ruby>require 'win32/sound' include Win32

sound1 = ENV['WINDIR'] + '\Media\Windows XP Startup.wav' sound2 = ENV['WINDIR'] + '\Media\Windows XP Shutdown.wav'

puts "play the sounds sequentially" [sound1, sound2].each do |s|

 t1 = Time.now
 Sound.play(s)
 puts "'#{s}' duration: #{(Time.now.to_f - t1.to_f)} seconds"

end

puts "attempt to play the sounds simultaneously" [sound1, sound2].each {|s| Sound.play(s, Sound::ASYNC)}

puts <<END the above only plays the second sound2 because the library only appears to be able to play one sound at a time. END

puts "loop a sound for a few seconds" puts Time.now Sound.play(sound1, Sound::ASYNC + Sound::LOOP) sleep 10 Sound.stop puts Time.now

puts "manipulate the volume" vol_left, vol_right = Sound.wave_volume Sound.play(sound1, Sound::ASYNC) sleep 1 puts "right channel quiet" Sound.set_wave_volume(vol_left, 0) sleep 1 puts "left channel quiet" Sound.set_wave_volume(0, vol_right) sleep 1 puts "restore volume" Sound.set_wave_volume(vol_left, vol_right)

sleep 1 puts "the asynchronous sound is cancelled when the program exits"</lang>

Tcl

Library: snack

<lang tcl>package require sound

  1. Potentially also require driver support for particular formats
  1. Load some sounds in; this part can be slow

snack::sound s1 s1 read $soundFile1 snack::sound s2 s2 read $soundFile2

  1. Play a sound for a while (0.1 seconds; this is a low-latency operation)

s1 play after 100 set done 1; vwait done; # Run the event loop for a while s1 stop

  1. Play two sounds at once (for 30 seconds) while mixing together

s1 play s2 play after 30000 set done 1; vwait done s1 stop s2 stop</lang> Note that this library is capable of handling both short and long sounds (sound effects and music).

UNIX Shell

<lang sh>#!/usr/bin/sh

  1. play.sh
  1. Plays .au files.
  2. Usage: play.sh <recorded_sound.au>

cat $1 >> /dev/audio # Write file $1 to the speaker's Character Special (/dev/audio). </lang>