Вот со звуком надо бы поработать....

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Джентельмен
постоялец
Сообщения: 162
Зарегистрирован: 16.10.2005 10:47:26
Откуда: Украина Донбасс Краматорск
Контактная информация:

Вот со звуком надо бы поработать....

Сообщение Джентельмен »

есть такая проблемпа... мне нужно... что бы по нажатию на кнопку через звуковую карту проиграть какой то звуковой файл... работаеть это все под виндой... как это зделать???
Sniper
постоялец
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение Sniper »

так пойдёт?

PlaySound('c:\....\*.wav',0,SND_FILENAME);

можно так

const
FileName = 'C:\YourFile.mid';
....
MCISendString(PChar('play ' + FileName), nil, 0, 0);
....
MCISendString(PChar('stop ' + FileName), nil, 0, 0);
Sniper
постоялец
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение Sniper »

Как вывести звук через звуковую карту?
взято из DRKB (http://www.drkb.ru)

Код: Выделить всё

uses 
MMSystem;

type
TVolumeLevel = 0..127;

procedure MakeSound(Frequency{Hz}, Duration{mSec}: Integer; Volume: TVolumeLevel);
{writes tone to memory and plays it}
var
WaveFormatEx: TWaveFormatEx;
MS: TMemoryStream;
i, TempInt, DataCount, RiffCount: integer;
SoundValue: byte;
w: double; // omega ( 2 * pi * frequency)
const
Mono: Word = $0001;
SampleRate: Integer = 11025; // 8000, 11025, 22050, or 44100
RiffId: string = 'RIFF';
WaveId: string = 'WAVE';
FmtId: string = 'fmt ';
DataId: string = 'data';
begin
if Frequency > (0.6 * SampleRate) then
begin
   ShowMessage(Format('Sample rate of %d is too Low to play a tone of %dHz', [SampleRate, Frequency]));
Exit;

end;

with WaveFormatEx do
begin
   wFormatTag := WAVE_FORMAT_PCM;
   nChannels := Mono;
   nSamplesPerSec := SampleRate;
   wBitsPerSample := $0008;
   nBlockAlign := (nChannels * wBitsPerSample) div 8;
   nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
   cbSize := 0;
end;

MS := TMemoryStream.Create;

with MS do
begin
   {Calculate length of sound data and of file data}
   DataCount := (Duration * SampleRate) div 1000; // sound data
   RiffCount := Length(WaveId) + Length(FmtId) + SizeOf(DWORD) +
     SizeOf(TWaveFormatEx) + Length(DataId) + SizeOf(DWORD) + DataCount; // file data
   {write out the wave header}
   Write(RiffId[1], 4); // 'RIFF'
   Write(RiffCount, SizeOf(DWORD)); // file data size
   Write(WaveId[1], Length(WaveId)); // 'WAVE'
   Write(FmtId[1], Length(FmtId)); // 'fmt '
   TempInt := SizeOf(TWaveFormatEx);
   Write(TempInt, SizeOf(DWORD)); // TWaveFormat data size
   Write(WaveFormatEx, SizeOf(TWaveFormatEx)); // WaveFormatEx record
   Write(DataId[1], Length(DataId)); // 'data'
   Write(DataCount, SizeOf(DWORD)); // sound data size
   {calculate and write out the tone signal} // now the data values
   w := 2 * Pi * Frequency; // omega
   for i := 0 to DataCount - 1 do
   begin
     SoundValue := 127 + trunc(Volume * sin(i * w / SampleRate)); // wt = w * i / SampleRate
     Write(SoundValue, SizeOf(Byte));
   end;
   {now play the sound}
   sndPlaySound(MS.Memory, SND_MEMORY or SND_SYNC);
   MS.Free;
end;
end; 
// How to call the function:
procedure TForm1.Button1Click(Sender: TObject);
begin
MakeSound(1200, 1000, 60);
end;
haword
постоялец
Сообщения: 301
Зарегистрирован: 02.03.2006 10:34:40

Сообщение haword »

Джентельмен писал(а):есть такая проблемпа... мне нужно... что бы по нажатию на кнопку через звуковую карту проиграть какой то звуковой файл... работаеть это все под виндой... как это зделать???

сюда смотрел acs.ullihome.de?
YouROK
незнакомец
Сообщения: 7
Зарегистрирован: 07.01.2008 10:55:42
Откуда: Сергиев Посад

Сообщение YouROK »

А как насчет Win CE?
У меня почемуто не находит mmsystem когда включаю в настройках компилятора целевую платформу для КПК.
А когда снова переключаю опять находит.
В чем проблема?
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

Здрасьте.
А подскажите, как зациклить проигрывание mid?
так играет:
MCISendString(PChar('play ' + FileName), nil, 0, 0);
а вот так:
MCISendString(PChar('play ' + FileName+ 'repeat'), nil, 0, 0);
ни в какую! И, я так понял, так у всех.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

http://wiki.lazarus.freepascal.org/ACS
ACS is an freeware crossplatform set of components designed to perform different sound-processing tasks. It supports reading the audio data from CD, different fileformats at example wav,mp3,wma,ogg,mac and others, output to soundcard and files are sure also possible.

В СТ уже установлена.
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

pupsik писал(а):https://github.com/fredvs/uos

Что-то все время одно и то же во всех examples
Да и таскать с собой 3 мб библиотек ради проигрывания 20 килобайтной мидишки как-то черезчур.
Снег Север писал(а):http://wiki.lazarus.freepascal.org/ACS
ACS is an freeware crossplatform set of components designed to perform different sound-processing tasks. It supports reading the audio data from CD, different fileformats at example wav,mp3,wma,ogg,mac and others, output to soundcard and files are sure also possible.

А как ее скачать-то?
Снег Север писал(а):В СТ уже установлена.

Извиняюсь. А это что?
Последний раз редактировалось kotompazb 21.09.2015 20:39:26, всего редактировалось 1 раз.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

ради
20 килобайтной мидишки
используйте стандартный (в вики есть) способ.
Если не ошибаюсь , если "поковырятся" в фпс можно найти еще несколько вариантов.

Снег Север советует вам скачать альтернативный вариант лазаря - codetyphon.

п.с.
По поводу ошибки. Если память не изменяет там "интересность" с одной библиотекой.
Но:
1. Я в винду давненько не хаживал (поэтому точно не могу сказать).
2. uos - вполне нормальный кросс вариант (там не только проиграть звук..).
3. кроме предложенных вариантов существует: bass, fmod и ...
По поводу зацикливания. А при окончании проигрывания проиграть снова? Хотя для этого надо узнать: когда оно закончит играть :roll:
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

Ладно. Всем спасибо. Буду разбираться.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

kotompazb писал(а):А как ее скачать-то?

По ссылке, см. секцию Download
kotompazb писал(а):Извиняюсь. А это что?

http://www.pilotlogic.com/sitejoom/
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

Хм..м: по поводу ошибки.
Поставил я uos в винде (правда 32 - битка) демки нормально работают.
Возможно у вас такое сообщение из-за битности.
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

pupsik писал(а):Возможно у вас такое сообщение из-за битности.

Система у меня 32-я. Возможно, потому что XP. Играет из демок только консольный плеер.
Аватара пользователя
McLion
постоялец
Сообщения: 332
Зарегистрирован: 06.02.2015 17:41:00

Сообщение McLion »

Джентельмен писал(а):есть такая проблемпа... мне нужно... что бы по нажатию на кнопку через звуковую карту проиграть какой то звуковой файл... работаеть это все под виндой... как это зделать???


Не много подробнее проект описать можешь?
Ответить