Audio overlap loop: Difference between revisions

Added Delphi example
(Added Delphi example)
Line 3:
 
Optionally take parameters for delay between repetitions, and decay (fractional volume reduction between consecutive repetitions).
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
{{libheader| Winapi.Windows}}
{{libheader| Winapi.MMSystem}}
<lang Delphi>
program Audio_Overlap_Loop;
 
{$APPTYPE CONSOLE}
 
uses
System.SysUtils,
Winapi.Windows,
Winapi.MMSystem;
 
function QueryIntNumber(Msg: string; min, max: Integer): Integer;
var
val: string;
begin
Result := 0;
repeat
Writeln(Msg);
Readln(val);
 
if not TryStrToInt(val, Result) then
begin
Writeln('"', val, '" is not a valid number.');
Continue;
end;
if Result < min then
begin
Writeln('"', val, '" must be greater then ', min);
Continue;
end;
 
if (Result > max) then
begin
Writeln('"', val, '" must be lower then ', max);
Continue;
end;
 
Break;
until True;
end;
 
function QueryFloatNumber(Msg: string; min, max: double): double;
var
val: string;
begin
Result := 0;
repeat
Writeln(Msg);
Readln(val);
// acept ',' ou '.' as decimal separator
val := val.Replace(',',FormatSettings.DecimalSeparator);
val := val.Replace('.',FormatSettings.DecimalSeparator);
if not TryStrToFloat(val, Result) then
begin
Writeln('"', val, '" is not a valid number.');
Continue;
end;
if Result < min then
begin
Writeln('"', val, '" must be greater then ', min);
Continue;
end;
 
if (Result > max) then
begin
Writeln('"', val, '" must be lower then ', max);
Continue;
end;
 
Break;
until True;
end;
 
procedure SetWaveVolume(Volume: Double);
var
Caps: TWAVEOUTCAPS;
aVolume: Cardinal;
VolumeCanal: Word;
begin
VolumeCanal := Trunc(Volume * word(-1) / 100.0);
aVolume := MakeLong(VolumeCanal, VolumeCanal);
if WaveOutGetDevCaps(WAVE_MAPPER, @Caps, sizeof(Caps)) = MMSYSERR_NOERROR then
if Caps.dwSupport and WAVECAPS_VOLUME = WAVECAPS_VOLUME then
WaveOutSetVolume(WAVE_MAPPER, aVolume);
end;
 
procedure Play(music: string; volume: Double = 100.0; delayMs: Cardinal = 0);
begin
SetWaveVolume(volume);
PlaySound(Pchar(music), SND_SYNC, 0);
if delayMs > 0 then
Sleep(delayMs);
end;
 
var
vol: Double = 100.0;
i: Integer;
rep: Integer;
delay: DWORD;
decay: Double;
 
begin
rep := QueryIntNumber('Enter number of repetitions (1 to 20) : ', 1, 20);
delay := QueryIntNumber('Enter delay between repetitions in milliseconds (0 to 1000) : ',
0, 1000);
 
decay := QueryFloatNumber('Enter decay between repetitions (0.01 to 0.99) : ',
0.01, 0.99);
 
for i := 1 to rep do
begin
Play('echo.wav', vol, delay);
vol := vol * (1 - decay);
end;
end.</lang>
{{out}}
<pre>Enter number of repetitions (1 to 20) :
5
Enter delay between repetitions in milliseconds (0 to 1000) :
0
Enter decay between repetitions (0.01 to 0.99) :
0.2</pre>
=={{header|Go}}==
As Go does not have any audio support in its standard library, this invokes the SoX utility's 'play' command with the appropriate parameters to achieve the 'echo chamber' effect.
478

edits