Från labbet

Animering med ASCII-tecken

Vi utforskade hur man skapar visuellt tilltalande ASCII-animeringar med hjälp av ljud och video som kan skickas mellan terminaler.

Tech used

  • Python
  • WebSocket

Press to view video

Bakgrund

Vi blev inspierade av en duktig konstnär på Instagram som skapar och lägger ut ASCII-animationer. Eftersom vi redan på förhand visste att det var Python vi ville jobba med så bestämde vi oss ganska snabbt för att dyka djupare i programmeringsspråkets konstnärliga egenskaper för att se vad vi kunde uppnå. Något som skulle visa sig vara en spännande utmaning fylld med värdefulla lärdomar.

Processen

Under projektets gång så var vårt huvudsakliga mål att bli bättre inom Python och framförallt vässa våra kunskaper för konstnärliga ändamål och lära oss hur man skickar ASCII-tecken mellan olika terminaler. För att nå vårt mål så valde vi att lägga ett stort fokus på utforskningsfasen och att samla in och analysera data samt testa olika vägar framåt.

I jakt på rätt kunskap så hittade vi också många värdefulla verktyg att använda oss av, inklusive ett Python-paket som konverterar video till ASCII från GitHub, ett plattformsoberoende bibliotek med färgad terminaltext från PyPl, samt ett konverteringsverktyg för att förvandla video i realtid till ASCII (GitHub).

Den stora utmaningen för oss var att optimera vårt Python-program så att det kunde hantera stora matriser och komplexa bild- och videoeffekter. Det faktum att vi ville att programmet skulle kunna köra 30 frames per sekund gjorde det inte enklare. Vi insåg därför ganska snabbt att vi skulle behöva använda avancerade matrismatematiska tekniker för att uppnå den nivå på prestanda som vi var ute efter. Även om det var kunskap som vi satt på sedan tidigare var det i ärlighetens namn begravt långt bak i hjärnbiblioteket och tog lite tid att få fram.

Att skicka frames i realtid mellan enheter med så kallade WebSockets var en annan utmaning vi stötte på eftersom vi, som redan nämnt, behövde skicka ganska stora matriser. Vi använde komprimering och uppackning av de komprimerade bilderna med låg latenstid för att lösa problemet.

Resultat / Lärdomar

Vår slutprodukt är en interaktiv terminalspelare som streamar och återproducerar genererade ASCII-animationer mellan två olika terminaler. Med hjälp av vårt Python-program, en mikrofon, och/eller något så enkelt som ett musklick så kan vi skapa animeringar med ASCII-tecken som kan skickas från en terminal till en annan. Om ni kommer ihåg de smått ikoniska WinAmp-visualiseringarna så är det här av liknande sort och, ärligt talat, en nostalgisk upplevelse.

Under resans gång har vi lärt oss väldigt mycket som vi med all säkerhet kommer att ha användning för i framtida projekt. Däribland:

  • Att protokollet för WebSockets inte är så svårnavigerat som man kan tro och att det kan vara ett värdefullt verktyg när det kommer till att skapa interaktiva webbappar.
  • Att det var väldigt viktigt att optimera strukturen för frames för att kunna skapa animationer i realtid. I projektet blev vi tvungna att utveckla vårt eget frame-format för att säkerställa att olika effekter skulle vara kompatibla med vår ASCII-spelare. Det var också något som ställde stora krav på bra arkitektur och planering. Risken är annars att man stirrar sig blind på detaljerna och skapar en salig röra, som Omar så fint uttryckte det.

Om vi blickar framåt för en potentiell iteration av projektet så skulle vi vilja lägga till fler spännande ASCII-effekter och sätt att interagera med själva spelaren. Möjligheterna är oändliga – eller ja – ganska exakt 128 tecken och 256 färger som motsvarar antalet ASCII-tecken och färger som finns att använda i terminalen.

Animering med ASCII-tecken