Jak to zrobic??????(Czas,Dżwięk)

0

Czy ktos moze wie jak odczytac doladny czas systemowy (z setnymi a jak sie da to nawet z tysiącznymi sekundy);
I jeszcze jedno: Jak odtworzyć dwa (i więcej) wav'y na raz???

Pozdrawiam @LL :-)

--
Rafalrs

0
  1. Time lub Now odczytuja czas z dokladnoscia do okolo 10 ms. Jest tez dokladniejszy zegar, nie daje czasu systemowego, ale pozwala na poiar czasu. Zobacz:
    http://www.4programmers.net/forum/index.php?action=show&id=3509

  2. Dwa MediaPlayery, albo zmiksuj wavy programowo przed odtworzeniem. --Pawel

Delphi6

0

Witam, {hello}
Co do czasu to np, procedura DecodeTime wydobywa z TDateTime godziny,minuty,
sekundy i milisekundy.
Co do wawów to chyba należy użyć współbieżości.-------------------------------------------------
Pozdrawiam i życzę miłego dnia.

0

Rozwin wspolbieznosc, pls - ja tez jestem zainteresowany...--Pawel

Delphi6

0

Właśnie napiszcie coś o mixowaniu kilku dźwięków, i zapisywaniu wyniku do pliku *.wav

0

Odnośnie tego czasu. Chodziłoby mi np. jak sprawdzić przez ile tysięcznych sekundy program wykonuje np. to (oczywiście w moim programie mam troche bardziej skomplikowane pętle):

var
num:extended;

begin
num:=0;
repeat
num:=num+1;
until num=1000000;
end;

A odnośnie dźwięku także prosiłbym o bardziej dokładne odpowiedzi :-)

Pozdrawiam @ll--Rafalrs

0

Odnosnie czasu: zajrzyj do watku o ktorym pisalem powyzej. Tam (pod koniec) jest moj post z metoda pomiaru czasu wykonywania sie kodu.

Odnosnie dzwieku: postaram sie napisac wiecej o miksowaniu innym razem, bo to szeroki temat.

na razie sprobuj tak:
MediaPlayer1.FileName:='d:\wavs\200.wav'; *tu daj nazwe swojego pliku
MediaPlayer1.Open;
MediaPlayer2.FileName:='d:\wavs\bye 16nr.wav'; *tu daj nazwe swojego pliku
MediaPlayer2.Open;
MediaPlayer1.Play;
MediaPlayer2.Play;

to nie dziala zawsze. przypuszczam, ze zalezy od karty.

--Pawel

Delphi6

0

Mi działa odtwarzanie dwóch dźwięków, ale kiedyś nie działało, bo moja karta obsługiwała 1 wątek, a jak jakiś program chciał odtworzyć kolejny to pisało że urządzenie jest zajęte.--Delphi 6
Pozdrowienia{hello} ,
Imperior

0

Co do mixowania: zacznijmy do formatu pliku Wave. W ogole to juz kiedys o tym pisalem na forum, ale sam nie moge tego znalezc :( . Wiec napisze jeszcze raz.

Wave to podformat typu Riff, ktory to Riff jest potwornie skomplikowany i moze miec wiele pol. jak ktos chce na tym panowac niech poszuka na necie i poczyta. Jesli program ma czytac 'obce' wavy, to trzeba poczytac, jesli tylko wlasne, to mozna olac. Na szczescie dla nas najprostsza i najczesciej wystepujaca forma pliku Wave jest prosta i sklada sie z naglowka:

type TWaveheader = packed record
RiffID : array [1..4] of char;
RiffLen : LongWord;
WaveID : array [1..4] of char;
FmtID : array [1..4] of char;
FmtLen : LongWord;
FormatTag : Word;
Stereo : Word;
Freq : LongWord;
BytesPSec : LongWord;
BlockAlign : Word;
BitsPer : Word;
DataID : array [1..4] of char;
DataLen : LongWord;
end;

oraz danych.

W naglowku:
RiffID musi byc 'RIFF'
RiffLen=dlugosc danych + 36 (w przypadku prostego Wavu)
WaveId 'WAVE'
fmtID='fmt '
fmtLen tu 16
FormatTag 1 oznacza dane PCM (liniowo probkowane, niekompresowane, czyli normalne, moze byc inaczej ale i tak przed miksowaniem trzeba rozkompresowac)
Stereo liczba kanalow 1 lub 2 - w dzisiejszych czasach pewnie bywa wiecej
Freq - czestotliwosc probkowania, zwykle 44100 (Jak CD) , 22050, 11025, 48000 Hz
BytesPerSec=FreqStereoBitsPer /8
BlockAlign= (bitsPer/8)*stereo
BitsPer - rozdzielczosc probkowania, zasadniczo 8 lub 16 (bit), choc wchodza tez formaty 24 i 32 bit. Tu sie nie znam.
DataID='data'
DataLen dlugosc danych ktore nastepuja

Dane: (ogranicze sie do 8 i 16bit mono i stereo)
zawartosc kolejnych bajtow dla:
8 bit mono
Probka0, Probka1, Probka2 itd
8 bit stereo
Probka0L, Probka0R, Probka1L, Probka1R,
16 bit mono
Probka0H, Probka0L, Probka 1H, Probka 1L
(H starszy bajt slowa danych, L mlodszy)
16 bit stereo
Probka0LH, Probka0LL, Probka0RH, Probka0RL, Probka1LH itd

probka to wartosc opisujaca chwilowa wartosc cisnienia akustycznego ktora w procesie probkowania jest mierzona z czestotliwoscia Freq. Dlatego odstep miedzy probkami =1/Freq

Dla 8 bit probka to unsigned byte, wiec 0 to najmniejsza mozliwa wartosc, 255 najwieksza mozliwa, a 127 to srodek. Czyli 'cichy'plik powinien byc wypelniony wartosciami 127.

Dla 16bit probka to signed word, co ma wiecej sensu. 0 to srodek ('cisza'), 32767 to max, -32768 to min.

Zmiksowanie dzwiekow polega na dodaniu do siebie odpowiadajacych probek signed w dzwiekach zrodlowych (przy 8 bit z korekcja na unsigned, dalej bede pisal o 16bit)

Problem powstaje, gdy wartosc po dodaniu jest &gt32767 lub &lt-32768. Mozna tem wstawic odpowiednio 32767 lub -32768, ale jest to clipping ktory powoduje znieksztalcenie dzwieku.
Banalny sposob obejscia to przemnozenie (przed miksowaniem) kazdej probki przez 1/liczba miksowanych dzwiekow. Wbrew pozorom nie jest to bardzo zle rozwiazanie ze wzgledu na logarytmiczny charakter percepcji dzwieku: przemnozenie przez 1/2 przycisza dzwiek o 6dB, przez 1/3 o niecale 10dB.

Inna metoda to wstepne dodanie wszystkich probek z umieszczeniem wyniku w czyms signed wiekszym niz word, przeszukanie w poszukiwaniu maksimum i minimum, jesli wykraczaja poza zakres signed word przemnozenie przez taki wspolczynnik zeby sie miescily i ostatecznie sprowadzenie do signed worda.

Kolejny problem, to miksowanie dzwiekow o roznych formatach. Oczywiscie, nalezy je sprowadzic do jednego formatu.
Mono do stereo to banal - do probek L i R wpisujemy te sama wartosc co byla w pliku mono
Stereo do mono: do mono wpisujemy srednia L i R
8 bit do 16 bit - wartosc 8 bit wpisujemy do high byte, low zostawiamy 0. UWAGA na konwersje z unsigned do signed!!!
16 do 8 - do prostych zastosowan wystarczy usunac low byte a high byte wpisac do pliku 8 bit. UWAGA na konwersje!! Dla wiekszej urody dzwieku nalezaloby to pobawic sie ditheringiem, czyli celowym dodawaniem szumu, ale podziwiam takich co beda to pisac sami.
konwersje roznych freq - tu tez juz trzeba sie wykazac umiejetnosciami wlasciwej interpolacji, odpowiedniego filtrowania, itd. Nie pomoge.

Jesli program na to pozwala (tzn bedzie czytal tylko 'wlasne' wavy), proponuje sprowadzic pliki do jednolitego formatu edytorem w rodzaju CoolEdit2000 i miksowac pliki o jednym formacie.
Aha, robiac save z CoolEdita nalezy odznaczyc 'Save extra
non-audio information', w przeciwnym wypadku mozna otzrymac Wava z dodatkowymi polami, i bedzie klopot.

Pozdrawiam, Pawel--Pawel

Delphi6

0

Dzieki za wyczerpujaca odpowiedz!!!!!!!!!!!! {browar} :-)

Pozdrawiam @ll--Rafalrs

1 użytkowników online, w tym zalogowanych: 0, gości: 1