Kirjautuminen

Haku

Tehtävät

Kilpailu

Ohjelmoi tekoäly!
Tulokset on julkaistu.
Onnea voittajalle!

Kilpailut: Säveltävä ohjelma

Järjestäjä: Metabolix

Vuonna 2007 pidettiin Putkaviisut, joissa kilpailtiin musiikin tuottamisesta. Tällä kertaa on vuorossa vastaava ohjelmointikilpailu: kuka saa tietokoneen tekemään itse musiikkia?

Kilpailuaika

Kilpailu alkaa perjantaina 10.12. ja päättyy lauantaina 15.1. Pian tämän jälkeen alkaa äänestys, joka päättyy lauantaina 29.1.

(Päivitys: äänestys on päättynyt ja tulokset on julkaistu.)

Kilpailun säännöt

Kilpailussa on tehtävänä ohjelmoida ohjelma, joka säveltää musiikkikappaleen sille annetun kappaleen nimen perusteella. Ohjelman säveltämän musiikin tyylilaji on täysin vapaa, eikä kappaleen tarvitse millään tavalla liittyä annettuun nimeen.

Osallistuja saa itse valita kappaleen, jonka perusteella ohjelma arvostellaan. Edustuskappaleet laitetaan kilpailun päätyttyä esille kuunneltavassa muodossa, ja Ohjelmointiputkan käyttäjät saavat antaa jokaiselle 1–10 pistettä.

Vaikka arvosteltavana on vain yksi kappale, ohjelman täytyy tuottaa eri nimillä kappaleita, jotka voidaan kiistatta todeta eri kappaleiksi ja joista usean satunnaisesti valitunkin taso suurin piirtein vastaa arvosteltavan kappaleen tasoa. Näin varmistetaan, että arvosteltavan kappaleen on todella säveltänyt ohjelma eikä ohjelman tekijä. Jos asiasta herää epäilyksiä, ohjelma voidaan hylätä. Rajoitukset eivät kuitenkaan ole kovin tiukat, joten rehellisen kilpailijan ei tarvinne vaivata päätään tällä säännöllä.

Ohjelman toiminta

Tekoäly on komentoriviohjelma, joka lukee syötteenään kappaleen nimen ja tulostaa sen perusteella itse kappaleen jäljempänä kuvatussa muodossa.

Ohjelman täytyy tulostaa samalla nimellä aina sama kappale, eli toiminta ei saa riippua mistään satunnaistekijöistä kuten kellonajasta. Myöskään kielten valmiita satunnaisfunktioita (rand, Random ym.) ei saa käyttää, ellei ole varmasti tiedossa, että funktion toiminta on täsmälleen sama kaikissa ympäristöissä. (Näennäistä satunnaisuutta voi tuottaa laskemalla lukuja jollain sopivalla kaavalla, tai ohjelman mukaan voi laittaa tiedoston, jossa on valmiiksi valittuja satunnaislukuja.)

Kappale saa kestää enintään kolme minuuttia, nuotteja saa soida enintään 30 samaan aikaan, ja tulostetta saa syntyä enintään kolme megatavua. Kilpailussa kannattanee panostaa ennemmin laatuun kuin määrään.

Kappaleen nimi

Kappaleen oikea nimi, joka näytetään kilpailun tulossivulla, saa sisältää suomalaisia aakkosia A–Ö ja a–ö, numeroita, välilyöntejä sekä ASCII-merkistön tavallisia välimerkkejä (esim. -.,:;?!'"). Nimi saa olla enintään sadan merkin mittainen, ja sen on sisällettävä ainakin yksi aakkonen tai numero.

Ohjelmalle nimi syötetään yksinkertaisemmassa muodossa, joka muodostetaan näin:

  1. Kaikki kirjaimet muutetaan pieniksi.
  2. Merkit å, ä ja ö korvataan merkeillä a, a ja o.
  3. Muut merkit kuin kirjaimet ja numerot muutetaan viivoiksi.
  4. Useammat peräkkäiset viivat korvataan vain yhdellä viivalla.
  5. Alussa ja lopussa olevat viivat poistetaan.

Esimerkiksi jos kappaleen oikea nimi olisi "Puolipistepirkko: häh, eikö softa toimi?!11", ohjelmalle syötettäisiin nimi "puolipistepirkko-hah-eiko-softa-toimi-11". Nimeä seuraa rivinvaihto.

Kappaleen muoto

Ohjelman täytyy tulostaa säveltämästään kappaleesta tekstimuotoinen kuvaus, jonka jokainen rivi vastaa yhtä sävellyksen nuottia tai tempomerkintää. Jokainen nuottia kuvaava rivi sisältää välilyönnein eroteltuina arvot korkeus, alku, kesto, sävy, voimakkuus, pehmennys ja häivytys. Useimmat arvot ovat lukuja, mikä tarkoittaa, että ne saavat sisältää numeroita 0–9 sekä tarvittaessa pisteen desimaalierottimena.

Arvoista vain korkeus on välttämätön. Puuttuviin arvoihin sovelletaan edellisen nuotin vastaavaa arvoa, tai jos mitään arvoa ei ole esiintynyt, oletusarvot tulevat tästä nuotista:

*     0     1     0.5   1     0.01  0.1

Nuotin korkeus voidaan ilmoittaa monella tavalla. Jos korkeus on luku, se kertoo nuotin korkeuden puolisävelaskelina siten, että yksiviivainen A (taajuus 440 hertsiä) on 57 ja keski-C on 48. Jos korkeus alkaa jollain kirjaimella, sen pitää olla nuotin nimi, jota välittömästi seuraa oktaaviala kokonaislukuna; kelvolliset nuottien nimet ovat Ces, C, Cis, Des, D, Dis, Es, E, Eis, Fes, F, Fis, Ges, G, Gis, A, As, Ais, B, H ja His, ja merkintä C4 tarkoittaa keski-C:tä. Kolmas vaihtoehto on merkitä korkeudeksi *, jolloin mitään ääntä ei synny mutta muut parametrit tallentuvat myöhempiä nuotteja varten.

Nuotin alku ja kesto ovat lukuja, jotka kertovat, milloin nuotti soi. Ne ilmoitetaan tempomerkinnän mukaisina iskuina; oletuksena iskun pituus on yksi sekunti.

Nuotin sävy on jokin luku nollasta yhteen; suurempi luku tarkoittaa pehmeämpää ääntä. Nuotin voimakkuus on myöskin luku; suurempi luku tarkoittaa kovempaa ääntä. Nuotin pehmennys on ei-negatiivinen lukuarvo, joka määrää, miten hitaasti ääni alkaa; pienempi arvo tarkoittaa äkillisempää ääntä. Nuotin häivytys on täysin vastaava mutta koskee nuotin loppua.

Seuraavat nuotit muodostavat tutun Hämähämähäkki-laulun alun. Ensimmäinen rivi ei tuota ääntä, vaan siinä asetetaan äänen kesto, sävy ynnä muut parametrit, jottei niitä tarvitse kirjoittaa seuraaville nuoteille. Muilla riveillä on nuotin nimi oktaavialoineen sekä aloitusaika (sekunteina, koska muuta tempomerkintää ei ole), ja joillain riveillä on lisäksi nuotin kesto. (MP3-versio)

*     0     0     0.8  1  0.01  0.1
D4    0     0.23
D4    0.25
D4    0.5
E4    0.75
Fis4  1
Fis4  1.5
E4    2     0.25
D4    2.25  0.15
E4    2.50  0.23
Fis4  2.75
D4    3     0.2

Tässä toisessa esimerkissä on käytetty sävelkorkeuksien ilmaisemiseen lukuarvoja, ja lisäksi nuottien lisäparametrit on merkitty kullekin nuotille erikseen. (MP3-versio)

48    0    0.2   0.6   0.9  0.001  0.05
49.7  0.4  0.1   0.6   0.6
52.2  0.6  0.15  0.6
53.5  1.0  0.6   0.6   1
57.3  1.8  0.3   0.4   0.9  0.001 0.2
41
65.1

Esimerkissä joiltain nuoteilta puuttuu arvoja, jolloin käytetään samassa kohdassa ylempänä esiintynyttä arvoa. Koska kahdelta viimeiseltä nuotilta puuttuvat jopa alku ja kesto, ne soivat samaan aikaan kuin ylemmän rivin nuotti, jolloin muodostuu moniääninen sointu.

Tempomerkinnät

Sävellys voi sisältää tempomerkintöjä, jotka kertovat, montako aikayksikköä minuuttiin mahtuu. Jos tempoa ei erikseen määrätä, se on 60, eli yksi aikayksikkö on yhden sekunnin. Esimerkiksi tempo 120 tarkoittaisi, että yksi aikayksikkö olisi puoli sekuntia. Tempomerkinnän jälkeen ajanhetki 0 tarkoittaa sitä hetkeä, jolloin kaikki aiemmat nuotit ovat loppuneet.

Seuraavan kappaleen alussa tempo on 60, joten kaksi ensimmäistä nuottia kestävät kumpikin tasan puoli sekuntia. Sitten tempoksi asetetaan 240, joten seuraavat neljä nuottia kestävät kukin neljäsosasekunnin ja viimeinen taas puoli sekuntia. (MP3-versio)

C4  0  0.5
D4  1  0.5
*   2  0
T 240
C4  0  1
D4  1  1
E4  2  1
F4  3  1
G4  4  2

*-rivi on tässä tarpeen, jotta tempomerkinnän ajankohdaksi tulee 2; ilman sitä ajankohdaksi tulisi D4-nuotin päättymishetki 1.5.

Saman kappaleen voisi kirjoittaa ilman tempomerkintää näin:

C4  0     0.5
D4  1     0.5
C4  2     0.25
D4  2.25  0.25
E4  2.50  0.25
F4  2.75  0.25
G4  3.00  0.5

Jos tempomerkinnästä puuttuu itse tempo, se ei muuta tempoa mutta nollaa kuitenkin aikalaskurin. Kolmas tapa edellisen kappaleen kirjoittamiseen olisi siis tämä:

C4  0     0.5
D4  1     0.5
*   2     0
T
C4  0     0.25
D4  0.25  0.25
E4  0.50  0.25
F4  0.75  0.25
G4  1.00  0.5

Soitto-ohjelma

Tekoälyn tulostamat ohjeet muutetaan ääneksi tällä ohjelmalla.

Paketissa ovat ohjelman Win32-käännös (soitin.exe), bat-tiedosto oman tekoälyn testaamiseen (testaa.bat), esimerkkiälyn Win32-käännös (savelo-esim.exe) sekä lähdekoodi (soitin.cpp) ja Makefile muita käännöksiä varten.

Windowsissa voit testata tekoälyäsi helposti näin:

  1. Lataa soitto-ohjelma (yllä).
  2. Laita soitin.exe ja testaa.bat samaan hakemistoon kuin oma ohjelmasi.
  3. Muuta tekstieditorilla tiedostosta testaa.bat kohdat savelo-esim.exe ja tama-on-kappaleen-nimi sopiviksi. (Jos ohjelmasi on tehty esimerkiksi Pythonilla, ajokomennoksi täytyy laittaa C:\Python\python.exe ohjelma.py tai muuta vastaavaa Python-tulkin sijainnista ja ohjelman nimestä riippuen.)
  4. Aja testaa.bat tuplaklikkaamalla!

Voit myös tallentaa tekemäsi kappaleen tekstitiedostoon (komentorivillä komennolla OmaOhjelma.exe >kappale.txt) ja raahata luodun tiedoston suoraan soitin.exe-kuvakkeeseen.

Linuxissa ja muissa käyttöjärjestelmissä testausohjelma täytyy kääntää itse, jos Windows-versio ei toimi. Pura paketti, mene komentorivillä kyseiseen hakemistoon ja aja komento make. Jos tarvittavat asiat (make, g++ ja SDL) on asennettu, syntyy ohjelmatiedosto soitin, jolle voi syöttää kappaleen joko tekstitiedostona tai putkella:

# Soitto ja tallennus (kappale.wav):
./soitin kappale.txt
# Vain soitto:
./soitin kappale.txt soita
# Soitto ja tallennus, data putken kautta:
echo "tama-on-kappaleen-nimi" | /jossain/on/omaohjelma | ./soitin
# Vain soitto, data putken kautta:
echo "tama-on-kappaleen-nimi" | /jossain/on/omaohjelma | ./soitin - soita

Lisää neuvoja voi kysellä keskustelussa.

Esimerkkiohjelmat

Kilpailua varten on tehty myös eri kielillä esimerkkiohjelmia, jotka muuttavat kappaleen nimen kirjain kerrallaan nuoteiksi melko yksinkertaisella kaavalla.

Ohjelman rajoitukset

Ohjelman käytössä on reilu gigatavu muistia ja yksi x86-64-prosessorin ydin, jonka kellotaajuus on 1,73 GHz. Ohjelmalla on minuutti aikaa tehdä sävellyksensä. Ohjelman täytyy keskittyä säveltämiseen; kaikenlainen epäilyttävä, kiero tai muuten asiaton toiminta johtaa hylkäykseen.

Ohjelman nimi

Jokaisella ohjelmalla on oltava nimi. Sopiva pituus on 3–15 merkkiä; kohtuuttoman pitkät nimet pyydetään muuttamaan. Sallitut merkit ovat isot ja pienet aakkoset ilman skandinaavisia merkkejä, numerot, viiva ja alaviiva, siis A–Z, a–z, 0–9, - ja _. Kaksi viimeksi mainittua eivät saa esiintyä nimen päissä. Tarkista valitsemasi nimen kelpoisuus ennen lähetystä!

Ohjelmointikieli

Kilpailukoneella on kääntäjiä ja tulkkeja monille ohjelmointikielille. Mikäli kuitenkin sopiva kieli puuttuu listalta, lähetä sähköpostia tai osallistu keskusteluun, niin selvitetään, voiko asialle tehdä jotain.

Tuetut ohjelmointikielet versioineen:

Tekoälyjen tulee pitäytyä kielten perusominaisuuksissa; kääntäjästä, kirjastoista, käyttöjärjestelmästä tai prosessorin tyypistä riippuvaisia ominaisuuksia on parasta välttää. Ohjelman on toimittava yllä mainituilla välineillä 64-bittisessä GNU/Linux-käyttöjärjestelmässä.

Käännöksissä käytetään kohtuullisia optimointiasetuksia, esimerkiksi GCC:llä ja FPC:llä valitsinta -O2.

Osallistuminen

Ilmoittautumiseen tarvitaan seuraavat tiedot:

Tiedot tulee lähettää osoitteeseen kilpailu@ohjelmointiputka.net. Viestin on oltava perillä viimeistään 15.1. Tiedot julkaistaan kilpailun tulossivulla; jos ehdottomasti ei halua nimeään tai nimimerkkiään julki, asiasta voi mainita viestissä.

Osallistumisesta lähetetään vahvistus muutaman päivän kuluessa. Tekoäly myös testataan lyhyesti, ja ilmenneistä virheistä kerrotaan vahvistusviestissä. Kukin kilpailija voi osallistua vain yhdellä tekoälyllä; viimeinen lähetetty ja toimiva versio katsotaan lopulliseksi.

Palkinnot

Putkaorkesteri esittää oman sovituksensa jostakin voittajan kappaleesta seuraavassa Putkamiitissä pidettävässä konsertissaan (elokuussa Assembly 2011 -tapahtuman yhteydessä), jos tämä sopii voittajalle ja kappale on mielekkäästi toteutettavissa Putkaorkesterin voimavaroilla.

Tarkennuksia

Kysymyksiä ja palautetta kilpailusta voi lähettää sähköpostitse tai keskusteluun. Erityisesti kilpailuohjeisiin, esimerkkeihin ja soitto-ohjelmaan liittyvistä epäselvyyksistä ja ongelmista saa ja kannattaakin rohkeasti kysyä: tarkoitus on kilpailla ohjelman sävellystaidoista eikä teknisistä yksityiskohdista.

Tietoa sivustosta