Endlich: Automatisches Backtiming durch „stummes Abfahren“!

So, Jeschäftsfreunde! In diesem Thread versicherte @Torben, daß der Trick mit dem stummen Abfahren von Titeln, z. B. von Instrumentals vor der vollen Stunde, nicht möglich sei. Ist es wohl auch nicht, aber er hatte dort selber einen Workaround vorgeschlagen, der aber aus irgendeinem Grunde nicht weiterverfolgt wurde. Soweit der Stand der Dinge.

Ich habe das nicht auf mir sitzen lassen, und daher zeige ich dem Boss jetzt mal, wo der Barthel den Rauscher holt!* :wink:

Im folgenden seht Ihr das neueste Produkt der TSD-Forschung (basierend auf Torbens Idee): Ein Skript, für solche, die ständig Ihr Backtiming vergessen (also wie mich). Es nimmt durch Knopfdruck (halbautomatisch also) den nächsten Titel zum Backtiming her, indem es ständig die CueIn-Marke nachführt, bis z. B. der zuständige Regler geöffnet wird. In diesem Falle ist dann der Titel automatisch so gekürzt worden, daß er zur vollen Stunde fertig sein wird. Mission accomplished!

Das Skript ist kombinierbar mit den hier schon vorgestellten Backtiming-Routinen – wie der betreffende (Schluß-) Titel ausgesucht wird, muß dann verfeinert werden. Damit wäre es dann zur Vollautomatik geworden. Ebenso könnte man die Soll-Ende-Zeit flexibel gestalten – all das nur als Anregung für weitere Forschungsarbeit. Leute mit Automation oder ohne Pult können das CueIn durch ein FadeIn ersetzen, es funktioniert im Prinzip genauso.

Weitere layoutmäßige Randbedingungen sind meiner Testumgebung geschuldet, ich hatte insbesondere

  • einen Button namens BUTTON.1 (leuchtet nur) und

  • einen (etwas breiteren) Button namens BUTTON.4 (das ist der zum EInschalten)

am Start. Diese Buttons geben beim klicken jeweils einen gleichnamigen Befehl von sich. Zum Ausprobieren läßt sich die Zeit im mAirList-Universum einfach durch Doppelklick auf die Zeitanzeige in der Statuszeile verändern, damit Ihr nicht immer jeweils auf die volle Stunde warten müßt.

Wie gesagt: Allen Anzeige- und Rückmeldungsquatsch kann man auch weglassen oder nach seinem eigenen Gusto gestalten. Ihr seid dahingehend sicher kreativ.

Und jetzt geht es los:

var                                                                            // Das übliche: Variablen deklarieren …
  NaechsteVolleStunde, DauerNT, AktuelleZeit, AktuellerCue, UrsprCueIn: TDateTime;
  SollBacktimen: boolean;
  NaechsterTitel: IPlaylistItem;

procedure OnLoad;                                                              // … und Startbedingungen festlegen
begin
  ExecuteCommand('BUTTON.4 OFF');
  ExecuteCommand('BUTTON.4 TEXT B/T Auto');
  SollBacktimen := false;
end;

procedure BacktimingAus;                                                       // Abschaltprozedur
begin
  SollBacktimen := false
  DisableTimer;
  ExecuteCommand('BUTTON.4 OFF');
  ExecuteCommand('BUTTON.4 TEXT B/T Auto');
  ExecuteCommand('BUTTON.1 OFF');
  NaechsterTitel.SetColor($EEEEEE);
  NaechsterTitel.SetCuePosition(ptCueIn, UrsprCueIn);
end;

procedure OnExecuteCommand(Command: string);
begin
  if (Command = 'BUTTON.4') AND NOT SollBacktimen then begin                   // Auto-Backtimer einschalten
    ExecuteCommand('BUTTON.4 ON');                                             // Den Schalter schön leuchten lassen
    SollBacktimen := true;                                                     // Zustand merken
    NaechsterTitel := CurrentPlaylist.GetItem(CurrentPlaylist.GetNextIndex);   // Nächsten ("Stand jetzt") Titel bestimmen und …
    DauerNT := TimeValueToSeconds(NaechsterTitel.GetDuration)/24/60/60;        // … dessen Dauer feststellen
    if NaechsterTitel.GetCuePosition(ptStartNext) <> 0 then                    // Falls StartNext gesetzt, dann dieses als Dauer nehmen
      DauerNT := TimeValueToSeconds(NaechsterTitel.GetCuePosition(ptStartNext))/24/60/60;
    UrsprCueIn := NaechsterTitel.GetCuePosition(ptCueIn);                      // Ursprüngliches CueIn merken
    NaechsterTitel.SetColor($00FF00);                                          // Grüne Marke setzen, damit man's weiß
    NaechsteVolleStunde := frac((Instance.FakeNow*24+1)/24 
      - frac(Instance.FakeNow*24)/24);                                         // Nächste volle Stunde bestimmen (die Methode mit "trunc" geht bei mir aus irgendeinem Grunde nicht)
    EnableTimer(500);                                                          // Timer in Halbsekundenschritten loslaufen lassen
  end
  else if (Command = 'BUTTON.4') AND SollBacktimen then begin                  // Alles wieder ausschalten
    BacktimingAus;
  end;
end;

procedure OnTimer;
begin
  AktuelleZeit := frac(Instance.FakeNow);                                      // Aktuelle Systemzeit ohne Jahr bestimmen
  if AktuelleZeit > NaechsteVolleStunde - DauerNT then begin                   // Wenn kritische Backtimingzeit erreicht, dann …
    ExecuteCommand('BUTTON.1 ON');                                             // … laß etwas leuchten
    AktuellerCue := AktuelleZeit - (NaechsteVolleStunde - DauerNT);            // Aus Randbedingungen aktuelle Cuezeit errechnen
    NaechsterTitel.SetCuePosition(ptCueIn, AktuellerCue * 86400);              // Titel bekommt laufend neues CueIn (in Sekunden) verpaßt (oder FadeIn, dann "ptFadeIn")
  end;
  ExecuteCommand('BUTTON.4 TEXT ' + FormatDateTime('hh:nn:ss', NaechsteVolleStunde - DauerNT) + '  ' 
    + FormatDateTime('nn:ss', AktuellerCue));                                  // Anzeigen: Sollstartzeit Nächster Titel, CueIn
  if AktuelleZeit >= NaechsteVolleStunde then                                  // Beim Erreichen der vollenStunde abschalten
    BacktimingAus;
end;


begin
end.



Spielt jetzt also der letzte Titel, der noch ganz in die Stunde paßt, so wandert bei Aktivierung der Funktion (ich habe sie hier zu Ehren des Mondlandungsjubiläums sehr apollomäßig B/T Auto genannt) das CueIn des allerletzten Titels derart nach hinten, daß beim Titelstart dessen Schluß immer auf die volle Stunde trifft, sogar, wenn er eigentlich schon hätte anfangen müssen. Wollte man das gar nicht, läßt sich der Vorgang auch abbrechen, und alles ist wie vorher. Und wenn Ihr es Euch doch wieder anders überlegt habt, könnt Ihr die Funktion auch jederzeit wieder einschalten.

Ohne mich selber über die Maßen loben zu wollen: Ich finde das geil!   :sunglasses:

Punktgenaue Grüße

TSD


* Sollte der Verhinderungsgrund Arbeitsüberlastung gewesen sein, nehme ich diesen Satz selbstverständlich zurück!

Nicht nur Du !!!
Ich habe das script eben ausprobiert und finde es ebenso g…enial :innocent: Ein Traum, vielen Dank dafür.

Martin

Hallo Tondose,

nach einigen Tests hätte ich noch einen Optimierungsvorschlag.
Müsste man nicht noch den “cue out” und “fade out”-Punkt abfragen?
Ich habe einen letzten Titel am Ende optimiert durch einen vorgezogenen cue-out Punkt (wegen 3 Sekunden Stille am Ende). Das scheint der Auto-Backtimer nicht zu berücksichtigen. Und ähnlich wäre es dann ja auch bei vorgezogenem “fade out”.

Grüße
Martin

Servus Martin,

in der Tat, es gäbe noch einiges zu optimieren. Auch ein gesetztes CueIn wird z. B. nicht berücksichtigt, was aber egal ist, weil die Anpasserei dann halt nur ein wenig früher startet. Zunächst war dieses Skript auch nur dazu gedacht, das Prinzip darzulegen.

Es gibt eine Funktion GetEffectiveDuration (oder so), aber die berücksichtigt (soweit ich das verstanden habe, man möge mich bitte korrigieren) auch „dynamische“ Effekte, wenn z. B. der letzte Titel über die nächste Fixzeit hinausragt – was er ja per Definition immer tut. Das führt zu Schwierigkeiten.

Nach welcher Wichtigkeit müßten die Marken denn berücksichtigt werden? Immer das jeweils kürzeste nehmen? Würde ein FadeOut zu dessen Beginn (einfach) oder Ende (weniger einfach) eingehen? Fragen über Fragen …
 

Forschende Grüße

TSD

Ich kenne nicht alle cue-Punkte. Aus meiner Sicht sind auf jeden Fall cue-out und fade-out (aber ENDE) wichtig. Start-next ergibt in diesem Fall m.E. weniger Sinn.
Wenn man im player auf die Tracklänge klickt (einmal oder mehrmals, weiß ich gerade nicht), wird die Endezeit des Tracks angezeigt. Wie die Programmintern heißt weiß ich natürlich nicht. Aber ich glaube, die berücksichitigt die cue-Punkte am Ende. Vielleicht kann man diese Zeit ja in dem script verwursten? Im Handbetrieb stelle ich mir die immer ein und starte den Titel stumm, wenn diese Zeit auf die volle Stunde springt.

Ich korrigiere mich: Auch das Ende des Fadeouts ist einfach herauszufinden

Wie wäre es mit der Mitte des Fade-Outs?

Diese „effektive Zeit“ suche ich schon die ganze Zeit und finde sie nicht. Liegt sicher an mir.


Gelernte und blinde Grüße

TSD

Wäre der Punkt, an dem der nächste Titel abgefahren würde. Warum nicht auch das Nachrichtenjingle?

Ich kann mir die Antwort auch selber geben: Du hast in erster Linie das Umschalten auf ein anderes Studio im Blick. Dann müssen die Titel natürlich fertig sein.

Zuende gespielte Grüße

TSD

Meintest du vielleicht …

(...)
    <Attributes>
      <Item>
        <Name>EffectiveDuration</Name>
        <Value>418352</Value>
      </Item>
    </Attributes>
(...)

Danke, Uli.

Soeben stelle ich aber fest, daß die EffectiveDuration sich immer auf den Beginn des Fade-Outs-bezieht. Schade. Na, bastle ich mir das halt so hin.

Emsige Grüße

TSD


Edit: Und stelle weiter fest, daß ohne explizite Eingabe eines FadeEnd das Fade-Ende mühsam aus dem Player herausgemurkst werden muß … Das meinte ich oben mit „weniger einfach“.

Ich halte das für ebenso konsequent wie logisch.

  1. Der Fade Out kann als Start Next definiert werden (in den Optionen schaltbar).

  2. Die Fade Time kann in der Konfiguration verändert werden.

Denkmodell: Könntest du bei den Songs, die Backtimer sein sollen, die Fade Time nicht temporär verkürzen?
Sprich: Cue Out = Fade Out + 1,5 Sekunden.

Natürlich nur für alle Songs, die eine Differenz zwischen Fade Out und Cue Out von größer [Wert = “Reißblende”] haben. Dann addierst du zum Fade Out besagte 1,5 Sekunden hinzu und hast so die …
EffectiveDuration recalced.

Am I wrong?

So, bitte sehr:

var                                                                            // Das übliche: Variablen deklarieren …
  NaechsteVolleStunde, DauerNT, AktuelleZeit, AktuellerCue, UrsprCueIn: TDateTime;
  SollBacktimen: boolean;
  NaechsterTitel: IPlaylistItem;

procedure OnLoad;                                                              // … und Startbedingungen festlegen
begin
  ExecuteCommand('BUTTON.4 OFF');
  ExecuteCommand('BUTTON.4 TEXT B/T Auto');
  SollBacktimen := false;
end;

procedure BacktimingAus;                                                       // Abschaltprozedur
begin
  SollBacktimen := false
  DisableTimer;
  ExecuteCommand('BUTTON.4 OFF');
  ExecuteCommand('BUTTON.4 TEXT B/T Auto');
  ExecuteCommand('BUTTON.1 OFF');
  NaechsterTitel.SetColor($EEEEEE);
  NaechsterTitel.SetCuePosition(ptCueIn, UrsprCueIn);
end;

procedure OnExecuteCommand(Command: string);
begin
  if (Command = 'BUTTON.4') AND NOT SollBacktimen then begin                   // Auto-Backtimer einschalten
    ExecuteCommand('BUTTON.4 ON');                                             // Den Schalter schön leuchten lassen
    SollBacktimen := true;                                                     // Zustand merken
    NaechsterTitel := CurrentPlaylist.GetItem(CurrentPlaylist.GetNextIndex);   // Nächsten ("Stand jetzt") Titel bestimmen und …
    DauerNT := TimeValueToSeconds(NaechsterTitel.GetAudibleDuration)/24/60/60; // … dessen Dauer feststellen
    UrsprCueIn := NaechsterTitel.GetCuePosition(ptCueIn);                      // Ursprüngliches CueIn merken
    NaechsterTitel.SetColor($00FF00);                                          // Grüne Marke setzen, damit man's weiß
    NaechsteVolleStunde := frac((Instance.FakeNow*24+1)/24 
      - frac(Instance.FakeNow*24)/24);                                         // Nächste volle Stunde bestimmen (die Methode mit "trunc" geht bei mir aus irgendeinem Grunde nicht)
    EnableTimer(500);                                                          // Timer in Halbsekundenschritten loslaufen lassen
  end
  else if (Command = 'BUTTON.4') AND SollBacktimen then begin                  // Alles wieder ausschalten
    BacktimingAus;
  end;
end;

procedure OnTimer;
begin
  AktuelleZeit := frac(Instance.FakeNow);                                      // Aktuelle Systemzeit ohne Jahr bestimmen
  if AktuelleZeit > NaechsteVolleStunde - DauerNT then begin                   // Wenn kritische Backtimingzeit erreicht, dann …
    ExecuteCommand('BUTTON.1 ON');                                             // … laß etwas leuchten
    AktuellerCue := AktuelleZeit - (NaechsteVolleStunde - DauerNT);            // Aus Randbedingungen aktuelle Cuezeit errechnen
    NaechsterTitel.SetCuePosition(ptCueIn, AktuellerCue * 86400);              // Titel bekommt laufend neues CueIn (in Sekunden) verpaßt (oder FadeIn, dann "ptFadeIn")
  end;
  ExecuteCommand('BUTTON.4 TEXT ' + FormatDateTime('hh:nn:ss', NaechsteVolleStunde - DauerNT) + '  ' 
    + FormatDateTime('nn:ss', AktuellerCue));                                  // Anzeigen: Sollstartzeit Nächster Titel, CueIn
  if AktuelleZeit >= NaechsteVolleStunde then                                  // Beim Erreichen der vollenStunde abschalten
    BacktimingAus;
end;


begin
end.

Die gesuchte Funktion heißt GetAudibleDuration! (Warum ich auf meinem System das Fade-Out nicht höre ist eine ganz andere Baustelle und hat mich tüchtig in die Irre geführt.)

Beharrliche Grüße

TSD

[Überschnittene Beiträge]

You aren’t.

Wie sich im Verlauf des Fadens herausgestellt hat, gibt es zwei verschiedene Grundannahmen für das Backtiming:

  • Erstens zum Zwecke eines Sendungs-Endes mit z. B. Umschaltung auf ein anderes Studio. Dann muß um hh:00:00 Ruhe im Karton sein.

  • Zweitens, um auf des Ende einer vollen Stunde in einer laufenden Sendung/Automation zu gelangen. Dann dürfte ein wenig mit dem folgenden Jingle o. ä. gemischt werden (daher auch die Idee mit StartNext), und man könnte sich verschiedene Zielpunkte vorstellen (daher auch die Idee mit der Mitte des Fade-Outs). Dann wird es aber beliebig kompliziert, weil man eine Auswahl treffen muß. Entweder es gibt nur einen Punkt im Skript, dann diskutieren wir uns scheckig, welcher von denen es sein soll, oder es ist wählbar, und das ist mir zu aufwendig. (Falls überhaupt machbar. Ich will ja nicht für allen Kram Buttons auf meinem Schirm haben.) Außerdem muß noch die Möglichkeit einer flexiblen Ende-Uhrzeit eingeflickt werden.

So wie es sich jetzt darstellt, deckt das Skript Fall 1 ab, und das ist für mich in Ordnung so. Weiteres ist vielleicht eine Idee für Torbens 6.3.

Zufriedene Grüße

TSD

Das neue script habe ich mit diversen cue-out-Änderungen getestet. Das klappt super. Allerdings habe ich das Gefühl, der Endpunkt kommt fast ein “Itzchen” zu spät. Wo könnte man da im script was schrauben?

Im Übrigen habe ich festgestellt, dass ich auch bei mir das fade-out nicht höre. Fade-in ist zu hören. Unerhört…

Konntest Du den Grund dafür finden?

Schöne Grüße
Martin

Wenn Du in der Zeile

NaechsterTitel.SetCuePosition(ptCueIn, AktuellerCue * 86400);

schreibst

NaechsterTitel.SetCuePosition(ptCueIn, AktuellerCue * 86400 + 10);

dann ist der Titel zehn Sekunden früher fertig. Bei minus entsprechend später.

Habe mich noch nicht gekümmert. Das überlasse ich anderen.

Faule Grüße

TSD

@calypso60 und @Tondose

Entschuldigt bitte jetzt meine Unwissenheit:

Wo muss das Script von @Tondose in mAirList eingefügt werden, damit die ganze Sache funktioniert?

stirnrunzelnder Weise gefragt

Gruß Peter

Im Konfigurationsprogramm bei Hintergrund-Scripts

@calypso60
Danke dir.

Gruß Peter

Dieses Skript hier ist für den Assist-Modus, also für Livesendungen gedacht. Wer jedoch Automation fährt oder einen Mixdown erstellen will, der wird hier fündig:


Verwiesene Grüße

TSD