{ +-----------------------------------------------------------------------+ | | | Auto-Drop v3.0 | | | | © 2022 Tondose (https://community.mairlist.com/u/tondose) | | | | | +-----------------------------------------------------------------------+ Voraussetzungen: • Platzhalter-Element mit Länge null und Titel wie in RAMPCAPTION definiert, vor dem zu rampenden Element plaziert. • Drop-Element unmittelbar _hinter_ dem zu rampenden Element plaziert (wie bei manueller Sendung auch). • Zu rampendes Element muß "Ramp1"-Marker besitzen. • Drop wird auf Marker "Ramp1" gezeitet, wenn Ramp nicht zu lang (einzustellen mittels Parameter DIFF). In diesem Falle erfolgt Plazierung auf "Cue-In"-Marker. • Länge des Drops darf Dauer der Ramp nicht überschreiten. Requirements: • Trigger Item (i.e. Dummy) of zero-length and title as defined in RAMPCAPTION, scheduled right before the item to be ramped (= "Ramp Item"). • Drop Item to be scheduled immediately _after_ Ramp Item (like in manual playout). • RampItem must feature "Ramp 1"-Marker. • Drop is cued to marker "Ramp1" if Ramp not too long (difference to be set with parameter DIFF). "In this case it is set over Cue-In"-Marker. • Drop item duration must not be greater than duration of Ramp. Changelog: v3.0 [+] Zeitdifferenz zwischen Ramp und Drop berücksichtigt Time difference between ramp and drop taken into account [+] Container trägt passenden Titel Container got appropriate title v2.0 [+] Drop kann auch auf "CueIn"-Marker gesetzt werden Drop can be placed onto "CueIn"-Mark alternatively v1.3 [-] "CueIn"-Marker nicht berücksichtigt/not taken into account v1.2 [+] Drop wird aus Playlist entfernt, wenn zu lang und vom Typ "Jingle" Drop will be skipped if too long and of type "Jingle" v1.1 [*] Kein "StartNext"-Marker mehr vorausgesetzt "StartNext"-Marker no more mandatory v1.01 [-] Fehler wenn zu wenige Elemente in der Playlist Error if too few items in playlist v1.0: [*] Erste Version First version } // Change values with care const //Randbedingungen definieren DIFF = 12; // Differenz zwischen Ramp und Drop in Sekunden // Time difference between ramp and drop in seconds FADELEVEL = -6; // Pegel der der Abblende in dBr / Fade-down level in dBr STARTFADEDOWN = 0.1; // Beginn der Abblende in Sekunden / Start of fade-down in seconds ENDFADEDOWN = 0.3; // Ende der Abblende / End of fade-down STARTFADEUP = 0.3; // Beginn der Aufblende / Start of fade-up ENDFADEUP = 0.2; // Ende der Aufblende / End of fade-up RAMPCAPTION = '++ Drop ueber Ramp ++'; // Titel des Steuerelements in Playlist // Title of Trigger Item { ---------------------------------------------------------------------------- } var // Deklaration der Variablen RampItem, DropItem: IPlaylistItem; procedure DropError(Message: string); // Routine für Fehlermeldung begin SystemLog('AutoDrop error: ' + Message); end; procedure DeleteDrop; begin if CurrentPlaylist.GetItem(CurrentPlaylist.IndexOf(DropItem)).GetItemType = pitJingle then // Falls Drop ein Jingle … begin CurrentPlaylist.BeginRead; try CurrentPlaylist.Delete(CurrentPlaylist.IndexOf(DropItem)); // … löschen DropError('Drop "' + DropItem.GetTitle + '" skipped from Playlist.'); finally CurrentPlaylist.EndRead; end; end; end; procedure SetRamp; // Drop auf Ramp setzen var RampCuePosition, DropDuration, RampDuration: TTimeValue; pl: IContainerPlaylistItem; si: ISilencePlaylistItem; begin DropDuration := DropItem.GetEffectivePlaybackDuration; // Spieldauer des Drops RampDuration := RampItem.GetEffectivePlaybackDuration; // Spieldauer des zu rampenden Titels RampCuePosition := RampItem.GetCuePosition(ptRamp1); // Position des "Ramp1"-Markers if RampCuePosition - DropDuration >= DIFF then // Wenn Ramp und Drop sich zu sehr unterscheiden RampCuePosition := RampItem.GetCuePosition(ptCueIn) + DropDuration + STARTFADEDOWN + 0.1; // Position des "CueIn"-Markers + Droplänge + Sicherheit if RampCuePosition = 0 then // Wenn Marker "Ramp1" nicht gesetzt … begin DropError('Ramp not marked.'); // Fehlermeldung und Ende DeleteDrop; end else if DropItem.GetEffectivePlaybackDuration >= RampCuePosition - STARTFADEDOWN - RampItem.GetCuePosition(ptCueIn) then // Falls Drop zu lang … begin DropError('Ramp is too short for scheduled drop. (Or drop is too long …)'); DeleteDrop; // … Nachricht und löschen end else // Falls alles i. O. … begin RampItem.SetCuePosition(ptStartNext, RampCuePosition - DropDuration); // StartNext zum Dropstart verschieben pl := Factory.CreateContainerPlaylistItem; // Container erstellen zur Wiederherstellung von StartNext si := Factory.CreateSilencePlaylistItem; // Stille zum Auffüllen erstellen si.SetDuration(RampDuration - RampCuePosition); // Ursprüngliche Länge wiederherstellen si.SetTitle('AutoDrop fill'); // Titel für Stillelement setzen si.SetAmplification(-12); // Nicht so aufdringliche Optik pl.GetPlaylist.Add(DropItem); // Drop in Container packen pl.GetPlaylist.Add(si); // Auffüllstille auch pl.SetTitle('Autodrop fill'); // Tiel für Container setzen CurrentPlaylist.BeginRead; try CurrentPlaylist.Insert(CurrentPlaylist.IndexOf(DropItem), pl); // Container in Playlist einfügen CurrentPlaylist.Delete(CurrentPlaylist.IndexOf(DropItem)); // Ursprünglichen Drop entfernen finally CurrentPlaylist.EndRead; end; RampItem.GetVolumeEnvelope.AddPoint // Blende unter Drop (RampCuePosition - DropDuration - STARTFADEDOWN, 0, 'FadeDownBegin'); // Hüllkurvenpunkte (HkP) zu Beginn des Drops RampItem.GetVolumeEnvelope.AddPoint (RampCuePosition - DropDuration + ENDFADEDOWN, FADELEVEL, 'FadeIDownEnd'); RampItem.GetVolumeEnvelope.AddPoint (RampCuePosition - STARTFADEUP, FADELEVEL, 'FadeUpStart'); // HkP am Ende des Drops RampItem.GetVolumeEnvelope.AddPoint (RampCuePosition + ENDFADEUP, 0, 'FadeUpStart'); SystemLog('AutoDrop message: Drop "' + DropItem.GetTitle + '" placed over title "' + RampItem.GetTitle + '".'); // Nachricht ins Log end; end; procedure OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState; Item: IPlaylistItem); // Bei Playerstart var ItemIndex: integer; begin ItemIndex := CurrentPlaylist.IndexOf(Item); if (CurrentPlaybackControl.GetAutomation) AND (NewState = psPlaying) then // Wenn Automation läuft und Player startet und … begin if (ItemIndex + 1 < CurrentPlaylist.GetCount - 1) then // … wenn genügend Elemente in der Playlist … begin if (CurrentPlaylist.GetItem(ItemIndex + 1).GetTitle = RAMPCAPTION) then // … prüfen, ob Steuerelement gesetzt begin DropItem := CurrentPlaylist.GetItem(CurrentPlaylist.IndexOf(Item) + 3); // Definition von Ramp und Drop nach vorgegebener Reihenfolge RampItem := CurrentPlaylist.GetItem(CurrentPlaylist.IndexOf(Item) + 2); SetRamp; // Ramp-Prozedur aufrufen end; end; end; end; begin end. // Punkt.