0item(s)

Uw winkelwagen bevat geen artikelen.

Product was successfully added to your shopping cart.
Swipe to the left

UniRadio - Radio Automatiseringssysteem geschreven door Patrick Sterk

By Margreet van Muyden 23 maart 2018 2739 Views No comments

Wie

Mijn naam is Patrick Sterk, 29 jaar en software ontwikkelaar in de taal object pascal of te wel: Delphi. In dit artikel zal ik dieper in gaan in het ontstaan van het radio automatiseringssysteem genaamd UniRadio en de achterliggende techniek.

Jaren 90

Met de introductie van het Dalet systeem halverwege de jaren 90 en het automatiseren van radiostations, is er (in Nederland) als het ware een standaard geïntroduceerd destijds waarbij getracht is om de radiostudio waar mogelijk te visualiseren. Het systeem werd uiteindelijk een dermate succes dat vrijwel elk nationaal en regionaal radiostation gebruik maakte van dit systeem. Dalet(5.x) was gebaseerd op een Sybase database server, vereiste(zeker in de 4.xx versies) een dure digigram audio kaart en is ontwikkelt in Visual C . Het had ook een aantal nadelen: Het was duur, het vergt veel onderhoud en niet altijd stabiel. Naar mate de tijd vorderde en de techniek vooruit ging raakte het systeem steeds sneller verouderd en kon het niet meer mee met de huidige tijd, waardoor er een aantal alternatieve systemen zijn ontwikkelt, waaronder UniRadio.

Project
Het UniRadio project dat wordt ontwikkelt in de meest recente Delphi versie en is een combinatie van een radio hobby, software development en behoefte aan een goedkoper systeem. Met dit project probeer ik een middenweg te vinden tussen de grootte automatiseringssystemen en de ‘kleine’ gebruiker. Met ‘de kleine gebruiker’ doel ik op thuis gebruik, op een locatie set en of internet radio stations, zodat het voor iedereen toegankelijk kan zijn. Uiteraard is het zo dat er op internet een lijst aan software te vinden is welke gratis zijn te downloaden en in te zetten zijn als automatiseringssysteem. In dergelijke systemen ontbreken(naar mijn inziens) een aantal punten waardoor het in mijn ogen niet aan mijn eisen voldoet. Met een eigen ontwikkeling heb je uiteraard de touwtjes letterlijk in handen en geeft het de vrijheid om te ontwikkelen waarvan ik denk dat, dat een goede toevoeging is aan het systeem zonder afhankelijk te zijn van derde en of andere software ontwikkelaars en de daarmee bijkomende kosten. De enigste beperking is mijn eigen kennis en kunde waar ik overigens tot op heden nog niet tegen aan gelopen ben.

Visualiseren
Een onderdeel wat o.a. een succes maakte van het oude Dalet systeem en tevens is ontwikkelt in UniRadio, is het visualiseren van de mengtafel in de studio. Hiervoor had men een grafische module ontwikkeld waarbij er twee audio sporen werden weergegeven, welke je kunt vergelijken met twee faders op je mengtafel. Met de module was het mogelijk om visueel overgangen te maken en voor te beluisteren eer deze ook daadwerkelijk on-air te horen zou zijn. Een bijkomende mogelijk was om jingles of ingesproken teksten(z.g. voicetracks) tussen de overgangen visueel te plaatsen en deze precies te positioneren tussen de muziek. Met deze grafische optie is tevens ook makkelijker om audio effecten toe te passen, zoals het aanpassen van het tempo, pitch, knippen, volume en / of VST effecten.



On-air!

Alle modules binnen het systeem werken samen; dit zowel buiten of tijdens de uitzending, maar zijn niet

LPlaylistManager := Core.CreatePlaylistManager(Owner);

afhankelijk van elkaar om te kunnen opereren. Zo is het mogelijk audio en of tekst items vanuit bijvoorbeeld USB stick rechtstreeks in de playlist te droppen zonder tussenkomt van de database. Overigens is het desgewenst mogelijk om te audio bestanden tijdens het droppen toe te voegen aan de onderliggende database waardoor de items hergebruikt kunnen worden. De navigator is een van de hoofd modules binnen het systeem. Hier wordt de uiteindelijke uur planning ingeladen inclusief de eventueel ingeplande reclameblokken, nieuws, weer & verkeer of andere eventueel op tijd geplande events. Op technisch vlak heb ik er voor gekozen om elke module welke voorzien is van een lijst(playlist) te voorzien van een PlaylistManager.



Deze PlaylistManager bevat alle items in de playlist inclusief de benodigde functionaliteit om bijvoorbeeld te bepalen welk item als eerst volgende afgespeeld dient te worden. Zodoende is elk zichtbaar item in de playlist van het type TPlaylistItem. Op basis van de ingevulde properties kan worden bepaald met wat voor item ik te maken heb. Zo kan een playlist item een blokheader, jingle, blokitem of we te maken hebben met een variabel duration item, zoals bijvoorbeeld nieuws, weer & verkeer. Diezelfde playlistmanager kan worden koppelt aan de grafische mix editor, waardoor het eenvoudig wordt om de bijhorende playlistitems te bewerken.


Scheduling

De hele programmering van muziek tot reclame/event blokken komen in zijn geheel samen in de Log Editor. Vanuit deze module worden de navigator en/of singleplayers gevoed met voor hun op dat moment geldende playlist. In Log Editor kunnen uiteraard ook wijzigingen worden aangebracht in de playlist. De playlist kan zowel handmatig in elkaar worden gezet alsmede worden ingelezen vanuit een externe playlist scheduler(zoals stationplaylist).

Hardware & Techniek

TCore
Zoals eerder vermeld ontwikkel ik het systeem in de meest recente Delphi professional versie. Op het moment van schrijven is dat Delphi 10.2.1. Als data opslag heb ik gekozen voor Microsoft SQL Server 2016 in combinatie met een ORM framework van Devart, genaamd: Entity framework. Als audio engine heb ik gekozen voor de engine van Un4seen(bass.dll). Het hele systeem bouw ik rondom een singleton core object welke de toegang verleend aan de diverse systeem objecten, zoals bijvoorbeeld:

  • Core.AudioEngine.Play(TPlaylistItem);
  • Core.AudioEngine.Stop(TPlaylistItem);
  • Core.AudioEngine.Seek(TPlaylistItem, aScrollValue: integer);
  • Core.AudioEngine.MuteDevice(TOutputDevice);
  • Core.AudioEngine.UpdateStopPosition(TPlaylistItem);
  • Core.SettingsManager.PropertyName(Read/Write);
  • Core.SettingsManager.Init;
  • Core.SettingsManager.Save;
  • Core.Utils.functions;
GDI


‘Alleen tekenen van je ziet’

for LCounter := 0 to Fragmenten.count -1 do
PaintAudioFragment(Fragmenten[LCounter]);

waarbij Fragmenten een TObjectList<TAudioFragment> is.

  • Threading
    Naast de core opbouw maak ik tevens veelvuldig gebruik van threads(OnniThreadLibrary). De meeste hiervan zijn parallel threads in de vorm van Async(procedure).AWait(procedure), zodat de software overweg kan met meerdere cores in de onderliggende CPU. Deze methode gebruik ik onder andere voor het inlezen van data, audio bestanden, checks en polling.

GUI
Omdat de logica geschieden is van de User interface, kan ik de user interface zonder problemen aanpassen. Voor het opbouwen van de user interface heb ik gekozen om gebruik te maken van DevExpress VCL componenten. Het TcxGrid is een component dat veelvuldig terug komt in de applicatie waaronder in de Navigator, Singleplayers, LogEditor e.t.c. Daarnaast is het toepassen van skins een stuk eenvoudiger geworden evenals het aanpassen van de GUI kleuren. In de toekomst zal het mogelijk worden om je eigen GUI indeling te maken, zodat software naar persoonlijke smaak kan worden ingedeeld.

Hardware
Muziek starten met de functietoetsen of met de muis, dat kan. Nog makkelijker wordt het als de software kan communiceren met diverse broadcast consoles. Het systeem heeft momenteel ondersteuning voor WheatNET, D&R, Velleman USB en de LabJack. Momenteel werk ik aan ondersteuning voor DHD, IO Warrior en de D&R Airmate. Om dit eenvoudig te bewerkstelligen ben ik bezig om een HAL(Hardware access layer) te implementeren waarbij het mogelijk wordt om eenvoudig nieuwe hardware aan het systeem te kunnen koppelen.

Verbinden en gebeurtenissen
In tijden van socialmedia, API’s en koppelingen, is UniRadio een open systeem. Het bevat mogelijkheden om data te exporteren naar XML en weer in te lezen in het systeem, koppelen met overige playout systemen en complete playlisten(inclusief audio bestanden) uit te wisselen tussen UniRadio gebruikers. Momenteel ben ik eveneens met een webportaal bezig om vanaf afstand inzicht te krijgen in playlisten en aan te passen. Buiten de communicatie met de buitenwereld heb ik er voor gekozen om gebeurtenissen te implementeren in het systeem. Om een voorbeeld te noemen: Indien een audio bestand fysiek wordt gewist en het betreffende item staat gepland, dan zal dit item rood kleuren en de status zal worden gewijzigd in ‘niet beschikbaar’.