Autor Beitrag
MarkusBauer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

Win XP Pro
Delphi 7 PE+Indy
BeitragVerfasst: Sa 31.07.10 23:06 
Hallo

ich muss für mein Programm Audiodateien in verschiedenen Formaten laden, bearbeiten und speichern können.
Ich habe es jetzt mithilfe diverser Tutorials geschafft die wichtigsten Formate zum Abspielen mit der bass.dll zu laden. Außerdem habe ich bei den Beispielen zu dieser Dll eine Routine zum Speichern in eine Wav-Datei gefunden. Zum Bearbeiten benötige ich jetzt eine Möglichkeit auf die Rohdaten der Musik zuzugreifen.

Wie kann ich über die Bass.dll die Musikdaten in einfachen Zahlen (z.B. in einem Array) bekommen, den ich verändern kann?
Mögliche Operationen wären z.B. lauter/leiser und Pausen einfügen, daher müsste ich die Daten auch in der Länge verändern können.

Danke schonmal
Markus
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 01.08.10 00:14 
Hi, das machst Du mit Bass_ChannelGetData.
kleines abgewandeltes Beispiel:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
procedure Readdata;
var
  PeakBuf: array[0..176400of integer;  //=1sekunde daten
  Data: ^smallint;
  //lc:integer;
  BufLen,i: Integer;
  counter: integer;
  peaksL: array of smallint;
  peaksR: array of smallint;
begin
    setlength(peaksL, 2600); //kann aber auch halb so gross sein wie Peakbuf
    setlength(peaksR, 2600); //kann aber auch halb so gross sein wie Peakbuf
    counter:= 0;
    BufLen:= Bass_ChannelGetData(HStream, @PeakBuf, 176400);
    Data:= @PeakBuf;
    
    while (buflen > 0do
    begin
        if (Data^) > pl then pl := (Data^)else
        if (Data^) < pl then pl := (Data^);    // Get LeftPeak
        Inc(Data);
        if (Data^) > pr then pr := (Data^)else
        if (Data^) < pr then pr := (Data^);    // Get RightPeak
        Inc(Data);
        BufLen:= BufLen -4 ;

        if counter > 2600 then break;
        
        peaksL[counter]:= pl;
        peaksR[counter]:= pr;

        inc(counter);
        pL:= 0;
        pR:= 0;
    end;

//ab hier übergibst du die Daten an die zu speichernde neuen wave
//wenn Du zum Beispiel Normalize durchführen willst!
//müsstest Du die Daten entweder um einen bestimmten Wert anheben oder senken
//z.B.
if peaksL[i]>=32768 then
   newwavpeak[i]:= peaksL[i]-100;

//eine Pause bzw. "Stille" währe dann so
 newwavpeak[i]:= 0;

//mal so auf die schnelle!
//Wenn der Puffer PeakBuf ausgelesen ist einfach, neuepos um 1 erhöhen, dann wieder von vorn anfangen mit lesen, bis stream ende. 
end;

Ist erst mal nur so als Vorschlag für den Anfang!

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
MarkusBauer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

Win XP Pro
Delphi 7 PE+Indy
BeitragVerfasst: So 01.08.10 15:33 
Danke erstmal, funktioniert soweit. Jetzt zwei Fragen: wie setze ich die Position, ab der ChannelGetData auslesen soll?
Und wie bekomme ich die bearbeiteten Daten wieder in die Bass.dll um sie von dort aus speichern zu können?
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 01.08.10 16:13 
Die Pos setzt Du mit:
ausblenden Delphi-Quelltext
1:
BASS_ChannelSetPosition(DeinStream, neupos, BASS_POS_BYTE);					

In die DLL bekommst Du gar nichts :wink: .
Sie stellt Dir nur die ganzen Funktionen zu verfügung! Wie Du die bearbeiteten Daten speicherst, steht glaube ich auch in den Demos drin. Ist im Prinzip nichts anderes als wenn Du ne mp3, wma oder Cdtitel in eine Wave packst bzw. eine neue wav erstellst. Muss man mal schauen auf Un4seen.com bzw die Bass Hilfe.

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!