Quiero generar y reproducir un sonido continuo con frecuencias y amplitudes específicas que cambian con el tiempo. No quiero tener un retraso entre los sonidos. ¿Cómo puedo hacer esto con Delphi o C++ Builder?¿Cómo puedo generar tonos continuos de frecuencias variables?
9
A
Respuesta
1
Mediante el uso de la biblioteca WaveAudio que es posible generar una onda coseno continua.
Iba a publicar un código pero no puedo encontrar la manera de hacerlo correctamente, así que no lo haré.
Pero todo lo que necesita hacer es utilizar TLiveAudioPlayer y luego anular el evento OnData.
Y también establece Async en verdadero si no hay mensaje de bomba.
17
Este ejemplo muy simple debe comenzar.
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows, MMSystem;
type
TWaveformSample = integer; // signed 32-bit; -2147483648..2147483647
TWaveformSamples = packed array of TWaveformSample; // one channel
var
Samples: TWaveformSamples;
fmt: TWaveFormatEx;
procedure InitAudioSys;
begin
with fmt do
begin
wFormatTag := WAVE_FORMAT_PCM;
nChannels := 1;
nSamplesPerSec := 44100;
wBitsPerSample := 32;
nAvgBytesPerSec := nChannels * nSamplesPerSec * wBitsPerSample div 8;
nBlockAlign := nChannels * wBitsPerSample div 8;
cbSize := 0;
end;
end;
// Hz // msec
procedure CreatePureSineTone(const AFreq: integer; const ADuration: integer;
const AVolume: double { in [0, 1] });
var
i: Integer;
omega,
dt, t: double;
vol: double;
begin
omega := 2*Pi*AFreq;
dt := 1/fmt.nSamplesPerSec;
t := 0;
vol := MaxInt * AVolume;
SetLength(Samples, Round((ADuration/1000) * fmt.nSamplesPerSec));
for i := 0 to high(Samples) do
begin
Samples[i] := round(vol*sin(omega*t));
t := t + dt;
end;
end;
procedure PlaySound;
var
wo: integer;
hdr: TWaveHdr;
begin
if Length(samples) = 0 then
begin
Writeln('Error: No audio has been created yet.');
Exit;
end;
if waveOutOpen(@wo, WAVE_MAPPER, @fmt, 0, 0, CALLBACK_NULL) = MMSYSERR_NOERROR then
try
ZeroMemory(@hdr, sizeof(hdr));
with hdr do
begin
lpData := @samples[0];
dwBufferLength := fmt.nChannels * Length(Samples) * sizeof(TWaveformSample);
dwFlags := 0;
end;
waveOutPrepareHeader(wo, @hdr, sizeof(hdr));
waveOutWrite(wo, @hdr, sizeof(hdr));
sleep(500);
while waveOutUnprepareHeader(wo, @hdr, sizeof(hdr)) = WAVERR_STILLPLAYING do
sleep(100);
finally
waveOutClose(wo);
end;
end;
begin
try
InitAudioSys;
CreatePureSineTone(400, 1000, 0.7);
PlaySound;
except
on E: Exception do
begin
Writeln(E.Classname, ': ', E.Message);
Readln;
end;
end;
end.
Aviso en particular, la interfaz limpia, se obtiene:
InitAudioSys;
CreatePureSineTone(400, 1000, 0.7);
PlaySound;
Cuestiones relacionadas
- 1. ¿Es posible generar tonos complejos en C#?
- 2. ¿Cómo puedo generar múltiples tonos de un color base dado?
- 3. Generación de tonos en Cocoa Touch
- 4. ¿Cómo sintetizar frecuencias exactas en flash?
- 5. ¿Cómo se generan frecuencias de tono dual en MATLAB?
- 6. Cómo extraer frecuencias semi-precisas de un archivo WAV usando transformadas de Fourier
- 7. Generación de tonos DTMF de enlace ascendente
- 8. subgrupos continuos con ddply
- 9. Combinación única de frecuencias
- 10. Cómo generar una tabla de frecuencias en R con frecuencia acumulada y frecuencia relativa
- 11. Imágenes de medios tonos en Python
- 12. ¿Cómo puedo usar ddply con variables variables?
- 13. ¿Cómo puedo generar variables de entorno para un shell de comandos en un script de Ruby?
- 14. ¿Cómo usar variantes de fuente "de dos tonos" en CSS?
- 15. ¿Cómo puedo generar colores contrastantes?
- 16. ¿Cómo puedo generar Javascript dinámico?
- 17. Python Lista de Ngrams con frecuencias
- 18. un promedio de más bloques continuos
- 19. tocando tonos de piano con C#
- 20. ¿Cómo puedo generar diagramas UML de Xcode4
- 21. Error al generar variables localizadas (como constantes)
- 22. cómo crear ms-access como subformularios continuos (widgets) en Qt?
- 23. Obtener frecuencias de términos en Lucene
- 24. ggplot: frecuencias relativas de dos grupos
- 25. ¿Cómo se simularía programáticamente frecuencias de procesador más bajas?
- 26. Cómo simular diferentes frecuencias de CPU y limitar RAM
- 27. ¿Cómo obtengo las frecuencias de cada valor en una FFT?
- 28. ¿Cómo puedo generar algo en Rhino?
- 29. ¿Cómo puedo generar el archivo .svc?
- 30. ¿Cómo puedo generar un GUID en Vim?
ver [familia de funciones waveOutXXX] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd757715 (v = vs.85) .aspx) –
Como no ha aceptado mi respuesta, Supongo que no te ayudó. ¿Quizás podrías explicar por qué no te ayudó? –