![]() |
Mathe Porblem
Hi Leute
möchte folgende Aufgabe lösen und komm nicht ans Ziel. ein automatisches Fadin oder Fadout. in Abhängigkeit von der vorgegeben Zeit ( Tin o. Tout ) und dem gesetzten Pegel ( din o. dout ) meine Versuche scheitern an der Mathelogik komm einfach nicht drauf. bis zu diesem Versuch bin ich nicht weiter gekommen.
Delphi-Quellcode:
dieses (Fade in) funct aber nur in dieser Testfase mit Volumen von 0-1000procedure TForm1.Timer1Timer(Sender: TObject); var s: TTime; pTime: LongInt; c: Real; tin:real; begin tin:=10; // Testwerte if CheckBox1.Checked then ptime:=MediaPlayer1.Length-MediaPlayer1.Position else ptime:=MediaPlayer1.Position; if fin >=1000 then exit else begin fin:=(fin+15.6/tin); //15.6 entspricht etwa 1sec c:=sqr(fin)/1000; //dies ergibt etwa ein log wert für Volumen //der untere Bereich bekommt dadurch ein weicheres Fade in SetMPVolume(MediaPlayer1,trunc(c)); trackbar1.selstart:=(100-trunc(c) div 10); //der Balken wird mit bewegt label5.caption:=inttostr(trackbar1.selstart); label7.Caption:=inttostr((trunc(c) div 10)); Label2.Caption:='Time :'+zeit(ptime); end; end; die Zeiteinstellung ( Tin ) funct auch, wie auch immer? in mein Orginalproject aber funct nichts mehr. ich hofe ihr könnt mir da Helfen. Gruss Alf |
Re: Mathe Porblem
[persönliche meinung]ich versteh nicht was ich machen soll[/persönliche meinung]
|
Re: Mathe Porblem
Hi
Zitat:
für diese ganze Umsetzung gibt es sicher die Möglichkeit eine Formel zu erstellen? nur komm ich nicht darauf. z.B. Tin ist die Fadein Zeit (z.B 0.5sec oder 10sec usw.) Din ist der Volumenentwert (z.B von 0- (800= Entwert) und nun starte ich den Player und die Musik wird weich eingefadet. Aber wie das ganze umsetzen? Gruss Alf |
Re: Mathe Porblem
Ich muss sagen, dass ich es auch nicht ganz verstanden habe.
Also, du willst ein FadeIn/Out beim Mediaplayer haben? Z.B.: Der Startwert der Lautsärke ist 0, diese soll in s Sekunden auf einen Endwert e ansteigen (Linear?)? Das wäre dann (hoffentlich :wink:):
Delphi-Quellcode:
if Time < s then
Volume := e / s * Time else Volume := e; |
Re: Mathe Porblem
hi
der Anfang ist gut, aber wo bleibt der pegel entwert der ist auch vorgegeben. oder hab ich das falsch gelesen? |
Re: Mathe Porblem
hi
Sorry hab das gerade ausprobiert funct leider nicht hoffe auf weitere Hilfe. Gruss Alf |
Re: Mathe Porblem
Ich hatte eigentlich gedacht, dass du dir den Endwert selbst herleitest :wink: .
Delphi-Quellcode:
[edit]Tolle Fehlerbeschreibung :zwinker: . Zeig mal deine Code-Umsetzung.
if Time < sIn then
Volume := e / sIn * Time else if Time > (Length - sOut) then Volume := e - e / sOut * (Time - (Length - sOut)) else Volume := e; |
Re: Mathe Porblem
Du willst, jetzt rein mathematisch gesehen, zwischen 2 y-Werten (y0=Anfangswert zu y1=Endwert) eine Funktion linear laufen lassen, und zwar über den Bereich x0 bis x1 (x entspricht in deinem Fall der Zeit, also x0=t0=0 bis x1=t1=5 sec.)
Deine Gleichung lautet, da du ja einen linearen Zusammenhang vorgibst,
Code:
Dabei ist k die Steigung, die du noch zu ermitteln hast. Du hast aber noch einen Fixpunkt, den du dir vorgibst, nämlich
y = k*x + y0
Code:
Daraus läßt sich die Steigung k bestimmen
y1 = k*x1 + y0
Code:
Und somit wird deine Funktion:
=> k = (y1-y0) / x1
Code:
Um dies jetzt in Delphi umzusetzen, lässt du x über den Bereich x0 bis x1 in beliebig kleinen Schritten variieren. Etwa so:
y = [(y1-y0)/x1] * x + y0
Delphi-Quellcode:
begin
x := x0 ; k := (y1-y0) / x1 ; Schrittweitex := 0.1 ; while x <= x1 do begin y := k*x + y0 ; // SetzeLautstärke // eventuell noch eine Pause einbauen, da die Schleife sonst zu schnell durchläuft. // Alternativ kannst du das Ganze auch mit einem Timer lösen x := x + Schrittweitex end ; end ; |
Re: Mathe Porblem
hi
Delphi-Quellcode:
irgendwo ist da noch der haken oder?
procedure TForm1.Timer1Timer(Sender: TObject);
var s: TTime; pTime,e : LongInt; c: Real; tin:real; begin e:=800; //Volumen endwert tin:=10; // Testwerte tin if CheckBox1.Checked then ptime:=MediaPlayer1.Length-MediaPlayer1.Position else ptime:=MediaPlayer1.Position; if Time < tin then label2.caption:=floattostr(e/tin*Time) //ergebnis 72,xxxxxxxxxxxxx zahlen //nix von 0-800 else timer1.Enabled:=false; ......... hi jelly Zitat:
das ganze muss über einen Timer Laufen! gruss Alf |
Re: Mathe Porblem
Zitat:
|
Re: Mathe Porblem
hi
ich habe nur deine Formel übernommen! hab mich schon gewundert was du mit (Time) meinst Time müsste jetzt ein Zähler werden der aufwärts zählt bis (tin) und da liegt der haken!!!!! Gruss Alf |
Re: Mathe Porblem
Zitat:
Nenn deine Variable einfach mal T. |
Re: Mathe Porblem
Hi Jelly
Mit der Time meine ich Khabarakh. Die Formel von ihm sah so einfach aus, ohne das ich genau geschaut habe. hab sie einfach übernommen einschliesslich der (Time Func) Missverständnis. Sorry- aber bin trotzdem noch nicht weiter. Gruss Alf |
Re: Mathe Porblem
Zitat:
Dabei hat sich Jelly schon die Mühe gemacht das alles mit Hintergrundinfos zu erklären. Du musst es einfach nur in dein Programm umsetzen - und zwar mit Hirn anstelle von [Crtl]+[c] [Crtl]+[v]... |
Re: Mathe Porblem
Ich kenne mich in Akkustik nicht so aus, aber ichmeine mal gelernt zu haben, dass zweimal so viele Motrorräder nicht dopplet so laut sind für das menschliche Ohr. Deswegen kann man das auch eventuell nicht linear machen? Ich weiß es nicht, nur so eine Vermutung. :gruebel:
|
Re: Mathe Porblem
Das (menschliche) Ohr hört logarithmisch, da liegst du mit deiner Vermutung schon richtig. Somit müsste man, um den Eindruck einer linearen Änderung zu erzeugen, eine logarithmische Skala zu Grunde legen. Für einen einfachen Fade tut's Liearität aber auch schon.
Für ein schönes nicht zu "abrupt" aufhörendes Fadeout ist log schon schöner, aber alles der Reihe nach ;). Wenn lineare Interpolation (Achtung! Guter Suchberiff! (Jelly hat aber eigentlich schon alles geschrieben)) schon zu viel ist, wird logarithmisch erstmal schwierig. (Eigentlich ist hier dann exponentiell nötig, als Umkehrfunktion des Logarithmus. Die beiden kompensieren sich dann zu einem linearen Höreindruck.) |
Re: Mathe Porblem
Zitat:
|
Re: Mathe Porblem
...um noch eins draufzusetzen:
![]() |
Re: Mathe Porblem
btw: oftmals wird das logarithmieren und so aber auch von "weiter unten liegenden komponenten" erledigt. ich muss an meinem verstärker zum beispiel nicht logarithmisch drehen. das kann der von alleine. von daher kann ich mir gut vorstellen, dass der MediaPlayer (oder wo auch immer du deine ermittelte Lautstärke verwendest) auch "normale, lineare Angaben" erwartet und das dann eigenständig "exponentiert".
|
Re: Mathe Porblem
Hallo Alf,
koenntest du bitte den Titel des Themas anpassen? "Mathe Problem" erzeugt ja nicht wirklich den Eindruck, dass es sich um ein Multimedia-Problem handelt. Danke Greetz alcaeus |
Re: Mathe Porblem
Zitat:
On Topic: Das Problem mit der Frequenzabhängigkeit der Lautstärke dürfte hier doch eher weniger bedeutsam sein -> So genau sch****t kein Hund :D. Zumal ja letztlich alle Frequenzen bei null ankommen. Der Einwand, dass evtl. die Hardware (bzw. Treiber) für die entsprechende Umsetzung sorgen ist auch nicht ohne! Das müsste man dann wohl mal testen... Bei meiner Soundkarte (SB Audigy Player) habe ich allerdings nicht den Eindruck dass dem so wäre. (Ich meine auch mal gelesen zu haben, dass selbst die Daten in Wave-Files log. interpretiert werden, damit die "leisen" Daten höher aufgelöst dargestellt werden können. Es mag aber auch sein, dass dies ein spezielles Wave-Format oder gar mp3 war :gruebel:) |
Re: Mathe Porblem
Hi Leute
nix für ungut habe aber das problem gelöst. die Vorlage kamm von Jelly
Delphi-Quellcode:
Anbei, sollte ein Forum auch für unwissende sein, so wie "Ich"
var
Vout: Real; Tfest: Real; Tout: Real; begin Vout:=800; //ist der Anfangwert von Volumen Tfest:=60; //ist der Anfangszeitwert, in msec Beispiel(59.500 o. 0,500) Tout:=Tfest*64.3; //in in sec (*4.3 scheint irgentwie was mit den TTimer zu tun //ansonsten gibt es eine Zeitdifferenz) ............ end; procedure TForm1.Timer1Timer(Sender: TObject); var pTime : LongInt; tt: real; Tin: real; begin if CheckBox1.Checked then ptime:=MediaPlayer1.Length-MediaPlayer1.Position else ptime:=MediaPlayer1.Position; Label2.Caption:='Time: '+zeit(ptime); if (Tout)>0 then begin tt:=(Vout/(Tfest))*(Tout/64.3); tin:=(sqr((tt))/1000); //hier wird der Wert in ein "Log" für SetMPVolume(MediaPlayer1,Round(tin)); //SetMPVolume, ergibt weiches Fade TrackBar1.SelStart:=(Round(1000-tt)); //der Balken wird mitbewegt Label7.Caption:=FloatToStr(Round((tt))); Tout:=(Tout-1); // Toutwert verkleinern end else Timer1.Enabled:=False; end; sonst breuchte man kein Forum oder? Programiere ja nur in der Urlaubzeit!! Dank an alle Gruss Alf |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz