Avatar billede speedy Nybegynder
02. september 2000 - 19:49 Der er 11 kommentarer og
1 løsning

create lyd (hz)

Hej

Hvordan kan man genere lyde, altså bare en tone med x hz. Jeg er ikke interesseret i at lave lyd med computerens indbyggede speaker, da jeg har leget en del med det. Men med speakeren kan man ikke mixe to toner.

Det jeg er interesseret i er, at kunne genere toner med x hz, og mixe 2, 3 eller flere toner.

/SpEeDy
Avatar billede jeppebecool Nybegynder
03. september 2000 - 17:34 #1
Hvis du \"bare\" vil generere en wav-fil, som kan afspilles i f.eks mediaplayer skal du finde ud af hvordan en sådan fil er opbygget. Her er et link til en siden \"programmers fileformat collection\".
Der ved jeg du kan finde information om den.
http://www.wotsit.org/

Hvis du vil afspille den direkte inde fra dit program skal du bruge mmsystem.pas filen. Den indeholder en masse funktioner til afspilning af både midi, wav og video. Men det er lidt hæftigt.
Avatar billede speedy Nybegynder
04. september 2000 - 21:17 #2
jeg prøvede at hente nogle af de der forklaringer på hvordan en wav-fil er opbygget, men jeg forstod rent ud sagt INTET :)

Er der ikke en der kan hjælpe lidt mere konkret om hvordan man kan generere en tone.

/SpEeDy
Avatar billede michaelras Nybegynder
05. september 2000 - 15:04 #3
Hvis du kan bruge svaret i low level MIDI så kig på http://www.eksperten.dk/spm/18201 hvor der allerede er svaret på et lignende spørgsmål

Michael
Avatar billede speedy Nybegynder
07. september 2000 - 11:46 #4
michaelras>> Jeps, det virker, men hvordan benytter man 2 kanaler på samme tid ??

Husk lige at svare. (Hvis du vil have points :))

/SpEeDy
Avatar billede michaelras Nybegynder
12. september 2000 - 14:41 #5
Kanaler....
Er det ikke bare at ændre det sidste tal: 90 = kanal 1, 91 = kanal2, 9F = kanal 16
altså:
midiOutShortMsg(OutHandle, $403C95); // Kanal 6

BTW: Volumen kan varieres vha. det første tal ($00-$7F)

Var det det du havde i tankerne ???

Michael
Avatar billede speedy Nybegynder
12. september 2000 - 17:45 #6
ja, det var noget i den stil, men hvordan kan du angive hvor mange herz tonen er på ??

/SpEeDy

Jeg accepterer nu, da jeg synes det er svar nok, men vil du ikke se om du kan svare på ovenstående spørgsmål ??
Avatar billede jeppebecool Nybegynder
13. september 2000 - 17:01 #7
Det er helt forkert det i er inde på (tror jeg)
Som jeg har forstået det vil du generere en tone, fx en sinus tone.
Det har ikke noget med midi at gøre.
Det har noget med wave filer at gøre.
Der ligger også funktioner til afspilning af wave\'s i mmsystem filen, og det er dem du skal bruge.
Midi er kun kommandoer til dit lydkort om at spille fx et C med en klaver lyd.
Med en wave fil angiver man de forskellige frekvenser der skal spilles.

Hilsen Jeppe
Avatar billede speedy Nybegynder
13. september 2000 - 19:11 #8
jeppebecool>> Jamen kan du hjælpe ?? Så opretter jeg da gerne et spørgsmål til dig. Skriv lige hvis du er i stand til at hjælpe. Jeg har været inde på de der sider om hvordan man generer en wav, men jeg fatter det simpelt hen ikke :((

Håber du lige gider at give svar. Så opretter jeg som sagt et spørgsmål til dig.

/SpEeDy
Avatar billede jeppebecool Nybegynder
14. september 2000 - 15:51 #9
Ja ... jeg kan godt hjælpe.
Men du skal lige fortælle mig om du vil (generere en wavefil) , som du så kan spille i en medieafspiller , eller du vil skrive til lydkortet direkte ( Det kræver en præsis timer ), og tålmodighed :).

Hilsen Jeppe
Avatar billede speedy Nybegynder
14. september 2000 - 17:21 #10
jeg har en præcis timer!! Og vil gerne kunne skrive direkte til lydkortet. er 100 point nok ??

Men hvis du ikke kan skrive direkte til lydkortet, er generering af wav ok.


/SpEeDy
Avatar billede jeppebecool Nybegynder
16. september 2000 - 19:00 #11
Okay ... indtil videre har jeg det her til dig:

implementation

{$R *.DFM}
var
      DeviceId : integer;
      devHandle : HWaveOut;
      WaveRes : mmResult;

function ReturnWaveOutDeviceName(DeviceID : integer) : String;
var  WaveOutCaps: TWaveOutCaps;
begin
  WaveRes := WaveOutGetDevCaps(DeviceID, @WaveOutCaps, sizeof(TWaveOutCaps));
  if WaveRes <> MMSYSERR_NOERROR then
    begin
      ShowMessage(\'Fejl ved søgning af produktnavn\');
    end;
  Result := StrPas(WaveOutCaps.szPname);
end;


procedure OpenWaveDevice();
var WaveFormat : TWaveFormatEx;
begin
  WaveFormat.wFormatTag := WAVE_FORMAT_PCM; { format type }
  WaveFormat.nChannels := 2;  { number of channels (i.e. mono, stereo, etc.) }
  WaveFormat.nSamplesPerSec := 44100;  { sample rate }
  WaveFormat.wBitsPerSample:= 16;  { number of bits per sample of mono data }
  WaveFormat.nBlockAlign:= WaveFormat.nChannels * (WaveFormat.wBitsPerSample div 8); { block size of data }
  WaveFormat.nAvgBytesPerSec:= WaveFormat.nSamplesPerSec * WaveFormat.nBlockAlign; { for buffer estimation }
  WaveFormat.cbSize:= 0; { the count in bytes of the size of }
  WaveRes := WaveOutOpen( @devHandle, deviceID, @WaveFormat, DWORD(Form1.WindowHandle), 0, CALLBACK_WINDOW);
  if WaveRes <> MMSYSERR_NOERROR then
    begin
      showMessage(\'Fejl ved WaveOutOpen\' + IntToStr(MidiRes));
    end;
end;


Procedure CloseWaveDevice();
begin
  WaveRes := WaveOutClose(devHandle);
  if WaveRes <> MMSYSERR_NOERROR then
    begin
      showMessage(\'Fejl ved WaveOutClose\' + IntToStr(WaveRes));
    end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
    vol : DWord;

begin
  memo1.clear;
  for i := 0 to WaveOutGetNumDevs - 1 do
    begin
      Memo1.Lines.add(ReturnWaveOutDeviceName(i) + \' , ID : \' + IntToStr(i));
      WaveRes := waveOutGetVolume(DevHandle, @Vol);
      Memo1.Lines.add(\'Volume : \' + IntToStr(Vol));
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DeviceID := WAVE_MAPPER;
end;

Jeg sidder lige og finder ud af hvordan man sender dataene .....

Ovenstående On-click procedure udskriver de WaveOutdevices ( altså de lydkort som kan afspille lyd) , som er installeret.

Procedurerne til at åbne og lukke lydkortet virker, så der er ikke så lang vej igen.

Hvis du selv vil rode lidt med det så er det procedurerne waveOutPrepareHeader(hWaveOut: HWAVEOUT; lpWaveOutHdr: PWaveHdr;
  uSize: UINT): MMRESULT; stdcall; og function waveOutWrite(hWaveOut: HWAVEOUT; lpWaveOutHdr: PWaveHdr;
  uSize: UINT): MMRESULT; stdcall; du skal have fat i. Men jeg skal nok gøre hvad jeg kan.

Hilsen Jeppe 
Avatar billede speedy Nybegynder
16. september 2000 - 19:04 #12
ok. tak!

Jeg venter med at oprette spørgsmålet til det virker. Ok ??

/SpEeDy
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester