Koodailu on joskus melko yksinäistä puuhaa - ainakin, jos koodaa yksikseen. Siksi oli erityisen miellyttävää tehdä yhteistyötä öljyvärimaalari Milla Isomäen kanssa. Minula on 34 kpl valokuvia hänen tauluistaan. Halusin keksiä eri animaation jokaiselle tauluvalokuvalle. Tuotoksena tämä animaatio:
Ei se tosin vielä lopullisessa kuosissaan ole. Ensi vuoden Projio media- ja valotaidetapahtumaan on melkein vuosi aikaa, eli on tässä aikaa parantaa sitä.
Sen soundit sain aikaiseksi siten, että latasin ilmaisesta pixabay kirjastosta 36 kpl hyvin lyhkäsiä syntsan soundeja. Arvoin niitä 500 kpl jonoon, sitten toiset 500 ja kolmannet ja laitoin nämä kolme ääniraitaa (jotka sain aikaiseksi ffmpeg ohjelmalla) Audacity äänieditorissa päällekkäin. Jokainen animaatio kestää 20 sekuntia ja sen jälkeen näytetään taulusta selkeää kuvaa 5 sek. Samalla näytetään taulun nimi. Tämän sain aikaiseksi omalla REBOL-kielisellä ohjelmalla, joka tuotti .srt eli tekstitystiedoston, joka oli muotoa:
1 00:00:00,000 --> 00:00:00,001 2 00:00:20,000 --> 00:00:25,000 Hukkummassa 3 00:00:45,000 --> 00:00:50,000 Talvella 4 00:01:10,000 --> 00:01:15,000 Puupää 5 00:01:35,000 --> 00:01:40,000 Niskaan hengittäminen 6 00:02:00,000 --> 00:02:05,000 Solbo
Jos ihmettelette, miksi minulla on ensimmäisenä teksityksenä pelkkä tyhjä rivi, niin se johtuu siitä, että VSDC editorin tekstitys toiminto kertakaikkiaan jättää ensimmäisen tekstityksen noteeraamatta.
Videon efektit sain musan tahtiin heilumaan VSDC editorin Edit the Beat toiminnolla. Kuten ehkä tarkkasilmäiset huomanette, niin videossa vaihdetaan 5 sekunnin välein efektiä. Vaati vähän kikkailua, että tein molemmat efektit koko videolle ja paloittelin ne 5 sekunnin pätkiin, joista joka toinen oli toista ja joka toinen toista, paitsi jos mod järjestysluku = 5, jolloin kyseessä oli selkeä kuva, jossa oli taulun nimi, niin sillä ei saanut olla minkäänlaista efektiä.
Se siitä proggiksesta. Nyt on valmisteilla toinen. Tunnin elokuva. Koska minulla on ne 34 erilaista kuville tuottavaa animaatiota ja lisäksi ohjelma, jolla voin tuottaa loputtomasti erilaisia kuvia, joista 300 esimerkkikuvaa on tuolla:
https://petke.info/uus/points.html
Aion siis tehdä kuvan ja arpoa sille animaation - tarkemmin sanottuna minulla on lista, missä kahden saman animaation etäisyys éi saa olla pienempi kuin 22 kpl, jotta ei tulisi liian nopeasti toistoa eri animaatioiden välillä. Sen listan tuottaminen oli mielenkiintoinen ohjelmointihaaste. ChatGPT:kään ei auttanut yhtään, vaan alkoi sekoilemaan täysin. Oli itse koodattava tällainen ohjelma:
REBOL [] koodeja: 34 ; Eri koodien määrä 34 etäisyys: 22 ; Minimi etäisyys saman animaation välillä animaatioita: 144 ; Animaatioiden määrä 144 tunnin elokuvaan valmiit: copy [] ; Lista koodeille 1...34 random/seed now/precise ; laitetaan ensin valmiit taulukkoon 144 satunnaista koodin arvoa valmiit: copy[] for i 1 animaatioita 1 [ append valmiit random koodeja ] ;aletaan tarkistamaan valmiit taulukkom kunnes se kelpaa... print "wait" until [ pieninetäisyys: 9999 ;tutkitaan niin kauan kunnes taulukosta löytyvä pienin etäisyys >= etäisyys i: 1 ; aloitetaan tarkistus ensimäisestä koodista until [ koodi1: valmiit/(i) ;taaksepän tarkistus indeksi: i - 1 if indeksi > 1 [ until [ if koodi1 = valmiit/(indeksi) [ ;löytyi sama koodi et: i - indeksi if et < pieninetäisyys [pieninetäisyys: et] if et < etäisyys [valmiit/(indeksi): random koodeja] ] indeksi: indeksi - 1 (indeksi = (i - etäisyys)) or (indeksi <= 1) ] ] ;eteenpäin tarkistus indeksi: i + 1 if indeksi < animaatioita [ until [ if koodi1 = valmiit/(indeksi) [ et: indeksi - i if et < pieninetäisyys [pieninetäisyys: et] if et < etäisyys [valmiit/(indeksi): random koodeja] ] indeksi: indeksi + 1 (indeksi > (i + etäisyys)) or (indeksi >= animaatioita) ] ] i: i + 1 i > animaatioita ] pieninetäisyys >= etäisyys ] print etäisyys probe valmiit halt
Aivan samoin kuin Milla Isomäen öljyväritaulujen kuvista näytetään 5 sekuntia selkeää kuvaa ja taulun nimeä, aion näyttää 5 sek kuvan nimeä. Kuvan nimen tuotan siten, että minulla on 50 adjektiivia ja 50 substantiivia. Erilaisia nimiä on siis 2500 kpl. Mutta tiedättekös mitä? Jos arpoo vain sattumalta adjektiivi ja substantiivipareja, niin todennäköisyys, että joillekin kahdelle eri taulule tulee sama nimi, kun tauluja on 144 kpl on noin 98.5%! On siis tarkistettava, että kuviennimet listaan kun laitetaan uusi nimi, ettei se jo ole siellä.
Lähettivät minulle äsken University of Utah & College of Charleston:sta kyselylomakkeen koskien taidettani! Halusivat tietää, mistä olen oppini saanut ja mitä ohjelmia käytän. Suunnittelevat sinne jotain "Art and Computing" ohjelmaa.
Enhän minä mitään ohjelmia käytä kuin omia REBOL-ohjelmiani ja oppini sen käyttöön olen saanut harrastuksistani. Toki Helsingin yliopistossa 80-luvulla opiskelin muita kieliä ja kaikissa lauseohjelmoinin kielissähän on samoja piirteitä, mutta kaikkea muuta siellä Pascal kielellä ohjelmoitiin kuin taidetta.
Niin! Ehkäpä jopa nimeni mainitaan Yhdysvaltalaisessa yliopistossa esimerkkinä siitä, kuinka taidetta tehdään! Se olisi hieno tunnustus! Hienoa olisi, jos professorit tai opiskelijat keskustelisivat luennolla:
"Ja tässä on esimerkki suomalaisesta taiteilijasta, Petri Keckmanista, joka käyttää REBOL-ohjelmointikieltä luodakseen taidetta. Hänen työnsä on osoitus siitä, miten omistautuminen ja luovuus voivat yhdistää teknologian ja taiteen täysin ainutlaatuisella tavalla." 😀
Haluaisin valaista, kuinka tein nämä soundit:
https://petke.info/syntsat1.mp3
Ne syntyivät minun, REBOL:in ja ffmpeg ohjelman yhteistyöllä. Ja toki kaikkien niiden, jotka ilmaisia syntsasoundeja ovat pixabayhin ladanneet:
https://pixabay.com/fi/sound-effects/
Tein syntsa soundi teoksen elokuvaan, mutta olen kokeillut myös viulun, sellon ja pianon soundeja. Niillä soundeilla saa eräänlaista "Kamarimusiikkijazzia" aikaiseksi:
https://petke.info/KamarimusiikkiJazzia.mp3
Kun kaikki erilaiset ladatut lyhyet syntsasoundit 51 kpl olivat yhdessä kansiossa, täytyi ne ensiksi nimetä 1.mp3, 2.mp3, ..., 51.mp3 sen tein tällä ohjelmalla:
rebol[] substr: func [string start length][ copy/part at string start length ] rebol[] hak: read %/E/Projio/Musa/ probe hak numero: 0 foreach tdsto hak [ if find tdsto ".mp3" [ print [numero tdsto] numero: numero + 1 rename to-file tdsto to-file rejoin [numero ".mp3"] ] ] halt
Sitten ne täytyi muuttaa .wav tyyppisiksi, koska olen huomannut, että kun .mp3 tyyppisiä yhdistää, niin tulee kauheita häiriöitä ja säröjä joskus. Tämä ohjelma:
rebol[] for i 1 51 1 [ print rejoin ["ffmpeg -i " i ".mp3 " i ".wav"] ] halt
printtaa käskyt, jotka copy/pastaan käsky.cmd scriptiin - toki olisin voinut pistää käskyt tulostumaan suoraan .cmd tiedostoon, mutta en nyt jaksanut.
Sitten arvon järjestyksen 2000:lle soundin pätkälle 51:stä ja tuotan 5:lle raidalla listan:
rebol[] emit: func [code] [repend teksti code] ;kerätään tekstiä teksti muuttujaan hipsu: to-char 39 newline: to-char 13 ;ffmpeg -f concat -safe 0 -i list1.txt -c copy syntsat1.wav random/seed now/precise for raita 1 5 1 [ teksti: make string! 100000 ;luulisi riittävän 100 tuhatta merkkiä tiedostolle for i 1 2000 1 [ emit ["file " hipsu (random 51) ".wav" hipsu newline] ] write to-file rejoin ["list" raita ".txt"] teksti ] halt
Tuon ohjelman ajon jälkeen minulla on viisi listaa, joissa ovat arvoittuina sattumanvaraisissa järjestyksissä soundit. Sen jälkeen käyn ajamassa käskyriviltä käskyt:
ffmpeg -f concat -safe 0 -i list1.txt -c copy syntsat1.wav
ffmpeg -f concat -safe 0 -i list2.txt -c copy syntsat2.wav
.
.
.
ffmpeg -f concat -safe 0 -i list5.txt -c copy syntsat5.wav
(tämänkin olisi tietysti voinut automatisoida, mutta ei kaikkea tarvitse)
That's it! Nyt minulla oli viisi raitaa, jotka taisivat olla jopa noin kahden tunnin pituisia, mutta latasin niistä kolme Audacityyn ja lyhensin tuntiin.
Maistiainen on jo saatavilla tunnin elokuvastani.
Huonolla tuurilla se alkoi alkeellisella 3D-kuutio animaatiolla - näyttävämpiäkin animaatioita on. Vielä huonompi tuuri oli nimessä: "Rauhallinen väri". Poistin mokoman adjektiivin taulukosta, kun kuvani ovat riemun kirjavia.
En tiedä kiinnostaako ketään mun tunnin elokuva proggis, mutta kun tässä on aikaa frameja tuottaessani, niin ajattelin kertoa hieman tarkemmin mitä olen täällä tekemässä.
Olen juuri nyt tätä kirjoittaessani tuottanut framen numero 98512 eli 91.2% frameista on tuotettu. Jotta ei tarvitsisi haukkaa liian iso palaa kakku kerralla niin siirrän projektissa aina 4000 kpl frameja manuaalisesti alikansioihin, jotka tein:
REBOL[] for k 1 27 1 [ make-dir to-file rejoin ["_kansio" k] ] halt
Teen alikansiossa animaation ffmpeg käskyillä. Esimerkiksi tässä kansion 24 videon tekokäsky:
ffmpeg -framerate 30 -start_number 92001 -i kuva%d.png -c:v libx264 -r 30 24.mp4
Kun kaikki framet on tuotettu teen viidenlaiset elokuvat.
1) glass efektillä
2) flow efektillä
3) push efektillä
4) bokeh efektillä
5) ilman efektiä
Kaikkien efektien yhteydessä käytän VSDC editorin Edit the Beat toimintoa eli efektit tapahtuvat soundien tahtiin.
Sitten pätkin kaikki elokuvat 5 sekunnin pätkiin eri alikansioissa. Oleellinen osa ohjelmaa on tämä:
lista: read %/E/projio2025/videotbokeh/ sort lista ;jätä: 1 ;glass - poistetaan muut ;jätä: 2;flow ;jätä: 3 ;push jätä: 4 ;bokeh ;jätä: 5 ;selkeä i: 1 until [ if not find lista/(i) ".r" [ either i = jätä [ print ["jätetään" i] jätä: jätä + 5 ][ print ["deletoi " i] delete to-file rejoin [i ".mp4"] ] ] i: i + 1 i > length? lista ] halt
Jokainen elokuva on siis pätkitty 720 osaan (720 * 5 s = 1 tunti). Ja tuo yo. poisti bokeh-efektin kansiosta kaikki tarpeettomat videon pätkät.
Sitten vain siirrän joka kansiosta videon pätkät yhteen kansioon ja sieltä VSDC editoriin ja renderöin videon.