keskiviikko 17. joulukuuta 2014

Midiman Oxygen 8 Keyboard



Kuvissa oleva Midiman Oxygen 8 kaksi-oktaavinen midi keybord voidaan yhdistää tietokoneeseen USB kaapelilla ilman mitään ulkoista rautatavaraa, laite myös saa myös virtansa USB:n kautta.
Soittaessa saamme ulos midi-viestejä, sinänsä laite itsessään ei tuota mitään ääntä, vaan se on vielä kytkettävä softa syntetisaattoriin ... siis johonkin ohjemaan joka kykenee midi-viestit muutettamaan ääniksi

Midi-viestit voidaan myös konsolissa tulostettua joko suoraan ruudulle tai tiedostoon.

Laite tietenkin vaatii ajurit, ja ainakin Ubuntussa ne löytyi suoraan pakettienhallinnasta nimellä midisport-firmware

KONSOLISSA:

amidi -l

Tuloksena meillä voi olla... jos kaikki on mennyt oikein
   Dir Device    Name
   IO  hw:1,0,0  Keystation MIDI 1

(voit harmalla alla olevan tekstin hypätä yli)

jolloin kutsulla:

amidi --dump -p hw:1,0,0

Laitteen tuottamat midi-viestit tulostuu suoraan ruudulle

90 35 27
     35 00
90 39 42
     39 00
90 3C 32
     3C 00
90 3E 19
     3E 00
90 40 37
     40 00

Yllä 5 koskettimen painallusta.

Viestit voidaan ajaa suoraan myös tiedostoon joko sysex dumppina tai sitten yksinkertaisesti putkitetaan jonnekin tiedostoon.

amidi --port=hw:1,0,0 --receive=dump.syx

amidi --dump -p hw:1,0,0 > dump.txt

Ääntä ei tietenkään tule ulos koska vaatii ohjelman joka pystyy soittamaan nämä midi-viestit

TYÖPÖYDÄLLÄ 1:

(lähes reaaliaikainen ääni ulos, ilman multimedia ydintä)

Tarvitaan nämä tai vastaavat ohjelmat

QjackCtl, graafinen liitäntä Jackiin
FluidSynth ja Qsynth käyttöliittymä

JACK Audio Connection Kit, jackilla saamme äänet yhdistetty niin että ne virtaa  Midimanilta FluidSynthille.

FluidSynth on reaaliaikainen syntetisaattori ohjelma ja siihen löytyy päälle Qsynth graafinen käyttöliittymä.
Näitä käyttäen Midiman:lla voidaan soittaa ilman viivettä, eikä tietokoneenkaan tarvitse olla ihan se maailman nopein, vaikka softa-syntikasta on kyse.



Kuvan yläosassa:   QSynth joka on graafinen liittymä fluissynthiin.
Siinä aluksi on asennettava äänifontit, Setup - Soundfonts ja sieltä valitaan tai kirjoitetaan polku fonttikirjastoon (esim /usr/share/sounds/sf2/FluidR3_GM.sf2)

Kuvan keskellä: Jack Audio Connection Kit (klikkaa connect)  ja sen alapuolella: Connections,
Ottamalla hiirellä kiinni vasemmanpuoleisesta laatikosta ja raahaamalla oikeanpuoleiseen teemme kytkennän, kuvasta selviää että kytkentä on tehty välillä 20:Keystation - 129:FLUID Synth

Jotta saamme Keystation näkymään on tietenkin kytkettävä USB kaapeli ja virtakytkin 1:lle Midimanissa, Jack osaa kyllä itse etsiä laitteet, mutta välillä joutuu Midimanin virtakytkintä käyttämään ei-on asennossa jos ääntä ei tule ulos, esimerkiksi jos tietokone on ollut välillä valmiustilassa.

Nyt pitäisi sitten ääntä tulla ulos, QSynth paneelin vasemmassa alakulmassa pitäisi vilkkua vihreä valo kun painetaan soittimen kosketinta.
(jos tietokoneen muut äänet katoaa esim. Youtube videoista ... sulje Jack ja FluidSynth)

TYÖPÖYDÄLLÄ 2:

Linux Multimedia Studio eli LMMS musiikkisekvensseri ohjelma.

Tätä ohjemaa käyttäessä ei tarvita SoftSynthtiä eikä Jackiä, sinänsä siis helppoa, mutta jonkinlainen viive on kuitenkin havaittavissa hitaammilla koneilla, muuten ohjelma tuntuu aika hyvältä, etenkin Piano Roll.
Nuotittaa ohjelma ei osaa.
Ohjelma ei kaappaa ääniä koneen muilta ohjelmilta, mutta jos kuitenkin tekee näin, äänet palautuu kun suljet ohjelman.

MidiManin kytkeminen tapahtuu aika helposti, valitse Song-Editor tai Beat+Bassline Editor klikkaa sitä työkalu ikonia mihin haluat laitteen kytkeä, ja sieltä polun päästä valitse laite (kuvassa)
20:0 Keystation:Keystation MIDI 1




jatkuu...


Gimp ja HDR kuva

HDR tarkoittaa High Dymamic Range eli laaja dynamiikka-alue, kuvan näkymä on HDR kuvissa laajempi kuin normaalisti, kuvan tummien ja vaaleiden alueiden sisältöä sadaan enempi esille.

Kun fotorealistisia HDR kuvia tehdään haarukoiduista RAW kuvasarjasta, vähintään 3 kuvaa,
normaali, alivalottunut, ylivalottunut. 
Minulla ainakin Gimp ohjelman kanssa tuli heti ongelmia, tarkemmin Sonyn RAW ARW formaatin kanssa, ohjelma näytti nämä kuvat aivan luonnottomilta.
Tarvitsemme siis vaikka Darktable ohjelman tähän, joka ymmärtää myös ARW:n päälle (viimeisin versio).

Mutta näitä feikki HDR kuvia voidaan kyllä tehdä vaikka yhdestä kuvasta, esimerkkinä on kuva joka näyttää kuin joltain hyperrealistiselta HDR kuvalta, mutta joka on kuitenkin tehty yhdestä 8 bittisestä JPEG kuvasta. Otin kuvan on Nokia N8 kameralla.

Kuva ei enään ole todellinen, näyttää maalaukselta ... ehkä näyttävä ja mielenkiintoinen, mutta ei todellinen. 

Toinen esimerkki on tehty ja Gimpillä yhdestä kuvasta, ei aivan samalla tapaan kuin yllä oleva, mutta lopputulos on paljon realistisempi.

Tästä kuvasta muunnos tehtiin

ja tulos on tässä

Jonkin verran paranee.

Kuva on kauttaaltaan sumuisen harmaa (Nokia N8)

Muutoksen jälkeen etualan värit tulevat esille, mutta taustalla olevat puut katoavat entistä enemmän sumuun ja taivaalla on purppuraa... mutta ehkä tässä on syvyyttä ?.

Tässä muutoksessa (sama tekniikka kuin ylhällä olevassa autokuvassa) havupuun ympärillä on eteerinen aura... huonosta kuvasta ei välttämättä saa hyvää, mutta jotain voidaan tehdä.

Jatketaan tästä .....

lauantai 6. joulukuuta 2014

Pianofreq - Sailfish Midi 3

Sailfish midi projekti etenee, kun on puhelin myös nyt käytössä.

Nimeksi tulee PianoFreq, joka oli minun tekemä pianon virittämiseen tehty win. ohjelma joskus vuonna 2004 ... ohjelma tuli ja meni mutta nimi jäi.

Ohjelman rakenne olisi - QML - Python - putkitus - Gstreamer (c koodia) - Wildmidi.
Tarvitaan Python 3 ja PyOtherSide. Pipe tehdään siis Python'lla, c-ohjelma on jo käännetty puhelimessa (siis emulaattorissa)

Vaikuttaa ehkä monimutkaiselta, toimii kyllä emulaattorissa, mutta tästä kaikesta on tehtävä paketti, jotta pääsee kokeilemaan sen asentamista puhelimeen ... Linux'n äänimaailman tuntien ongelmia tulee kyllä jossain vaiheessa.

Mutta miksi Python? ... koska tarkoitus on myös säveltää tällä ohjelmalla, ja tähän tarvitaan Pythonia
MidiUtil ja siihen oma koodi joka osaa säveltää. Ehkä myöhemmin tämä kaikki muutetaan C++ :n


  1. Ohjelma joka luo sointuja, tästä aloitetaan
jatkuu





sunnuntai 16. marraskuuta 2014

Sailfish Midi 2

Midiprojekti etenee,  ehkä vähän hitaasti, mutta eteenee silti.
Kuvassa näkyvä numerot on kappaleen hetkellinen kohta ja kappaleen pituus.
Tämä luetaan c koodista python putkituksen ja threadin kautta puhelimen ruudulle.
(kuvassa sekunnin tarkuudella,  mahdollista vaikka nanosekunnin tarkkuudella)
C koodi on käännetty suoraan puhelimessa eikä SDK:ssa ... ja miksi näin ?
jostakin syystä minulla ei SDK:n ja emulaattorin kirjastoissa ei vaan kaikki täsmää.
tai sitten en vaan osaa.

Ohjelmassa toimii nyt tällä hetkellä:
Pause ja Resume
Duration ja Position näyttö
Seek eteen ja taakse

Haku tosin kestää noin 3-5 sek. mutta tähän on ehkä olemassa jotain parannusta.
Kappaletta voidaan myös soittaa erillä nopeudella, mutta siitä tuskin on mitään iloa, koska samalla äänenkorkeus muuttuu. Mielenkiintoista olisi yhdistää kuvaa ja ääntä, koska gstreamer mahdollistaa tämän aika helposti.

Se mikä ei toimi vielä.
Audio panorama, bluethoot yhteys, volume säätö ym.



Kuvassa näkyy ohjelman ottamat cpu ajat.
(värjätty punaiseksi)

simple-player  -  c kielinen ohjelma.
Sound - QML ja PyOtherSide  ohjelma
Pulseaudio -  tuottaa äänen ulos.

Eli paljon on tehty töitä että ollaan päästy edes tähän, ja tästä sitten varsinainen homma alkaa... eli Midi sävellysohjelman teko.

Tästä myöhemmin lisää.




Kuva kertoo kaiken, Slider ei oikein sovellu sekuntien näyttämiseen.

Tarkoituksena myös on että Slideria liikuttamalla muutetaan myös positioita.

Aikani kun tätä testasin, näköjään midi voi olla myös väärin muodostettu,
jos muutat positiota ... ääni katoaa joissain kappaleissa.  

Lisää RAM muistia USB tai SD muistilla


Pc tietokoneen RAM muistia voidaan jatkaa USB tikulla tai SD kortilla sinänsä aika helposti Linux koneissa ... siis jos jotain valmista ohjelmaa tähän ei ole käytettävissä.

Yksinkertaisesti, tehdään tikusta/kortista SWAP osio, liitetään ja asennetaan prioriteetti

swapon -p 32767 /dev/sdf1  -- huom. tarkista osio
swapon -s  -- esim. näin tarkistetaan onko toiminnassa

Itseasiassa tässä lisätään swapin kokoa flash muistilla.
Yleensä swap-osio luodaan kiintolevylle käyttöjärjestelmää asennettaessa, mutta mahdollisesti se voi olla liian pieni, suositus kun on tuplaten mitä fyysinen muisti (RAM) on.

Oikeasti fyysistä muistia ei voi lisätä muuten kuin lisäämällä sitä , mutta koska suorittimen muistiavaruus jatkuu fyysisen (RAM) muistin yli näennäismuistille, ohjelmat voi olla myös siellä, niitä tosin ei voi ajaa siellä, vaan ne siirretään RAM muistiin, jolloin jotain on siirrettävä pois tieltä, takaisin näennäismuistille, ja tästä nimi ... SWAP


-------
Tässä sitten vähän tarkemmin miten tehdään swap levy

-Etsitään laite 

Laita USB tai SD kortti koneeseen,  aluksi siis etsitään mistä laitteesta tehdään swap lisämuisti.

kirjoita konsolissa -- (esimerkissä on 2 vaihtoehto -- df tai mount)

df
jos media on mount:ttu (liitetty) niin saadaan ulos jotain tällaista

kuvan alhaalta nähdään että laite on /dev/sdf1

tämän jälkeen meidän täytyy sitten irrottaa tikku
sudo umount /dev/sdf1

----------------

mount

ja jos media on mount:ttu (liitetty) niin saadaan ulos jotain tällaista


/dev/sdf1 on /media/USB DISK type vfat ...  riviä lyhennetty


jolloin huomataan että kyseessä on USB tikku ja laite on -- /dev/sdf1

irroita tikku

sudo umount /dev/sdf1


mutta normaalisti median asentaminen Pc:n ei automaagisesti kiinnitä mitään eli mount:aa,
jolloin on ehkä paras käyttää komentoa.

sudo fdisk -l
Huomataan kuvan alhaalta että laite on /dev/sdf1, voi tietenkin olla vaikka esim. /dev/sdb1 .. jne
ylempänä on kiintolevyn osiot /dev/sda..  eikä niihin parane puuttua.

Eli tässä tapauksessa laite on siis /dev/sdf1
varmista vielä ettei laite ole liitetty

umount /dev/sdf1


-Tehdään swap 

korvaa tekstissä sdf1 oman laitteesi tiedoilla ... varmista aina mille laitteelle kirjoitat

sudo mkswap / dev/sdf1   --- tehdään swap-osio

sudo swapon-P32767 / dev/sdf1  -- tai (swapon -p 32767 /dev/sdf1) -- liitetään / prioriteetti

Prioriteetti 0 - 32767 väliltä,
jos prioriteettiä ei aseteta, niin saamme oletuksena esim. arvot ..
swap flash -2 ja swap kiintolevy -1
-1 on tällöin korkeampi arvo

Kahdella swapillä prioriteetti voi olla myös sama, jolloin käytetään molempia vastavuoroisesti, ja tämä voi lisätä swapin nopeutta, edellyttäen että swapit on erillä laitteella.

-Varmista

swapon -s -- tai cat /proc/swaps
free -m  -- näyttää mikä on swapin koko
huom. Pc uudelleen käynnistettäessä swap pitää liittää uudelleen.

-Swappiness

Arvo väliltä 0-100

Määritellään miten ohjelmia tulee siirtää fyysisen ja swap muistin välillä.
Tai ehkä tarkemmin tällä määrätään ohjelman tyhjäkäynti aika, mikä se saa olla ennen kuin ohjelma siirretään swappiin.

pieni arvo -- ohjelmat halutaan pitää fyysisellä muistilla pitkään kuin mahdollista
suuri arvo -- ohjelmat halutaan siirtää swap muistilla, heti kuin mahdollista.

Eli suuri arvo, ohjelmia siirretään herkemmin swap:iin, jolloin muistia vapautuu levyvälimuistille (sekin on keskusmuistissa) ... koska käyttöjärjestelmä haluaa käyttää RAM:a mahdollisimman tehokkaasti.

toisaalta tyhjäkäynnillä olevat ohjelmat, niitten herääminen on hidasta, siirto swap muistista RAM muistille kestää.

Ubuntussa oletus on 60  ... ehkä turhan korkea, kokeile 30

cat /proc/sys/vm/swappiness  --- luetaan arvo
sudo sysctl vm.swappiness=10 --- tässä asetetaan arvoksi 10 

Mikä on sitten paras arvo ? -- ylensä suositellaan pientä arvoa, mutta myös vastakkaista mielipidettä löytyy .. koska tietokoneen käyttötapoja on niin monia.

-Swap tiedosto

Voidaan tehdä myös Swap tiedosto, jolloin ulkoisiata mediaa tai kiintolevyn osiointia ei tarvita.

dd if=/dev/zero of=/swapfile bs=1024 count=1048576  --- (1GB)
mkswap /swapfile
swapon /swapfile

-Mitä hyötyä?

Siis ulkoiselle muistille kirjoittaminen ei ole mitenkään nopeata, eikä siksi sillä voida sinänsä korvata RAM muistia, mutta joissain tapauksissa voi olla hyvinkin tarpeellinen lisä, voihan olla että konetta on päivitetty vaikka 2GB muistista 8 GB:n  mutta swap on vaan 2GB, eikä haluta kiintolevyä osioida, niin tällaistä systeemiä voisi harkita.
On myös muistettava että flash muistit ei ole ikuisia, mahdollisuus kirjoitottaa on noin > 10 000 kertaa

maanantai 21. heinäkuuta 2014

Midi selaimella



Midi musiikkia voidaan soittaa myös selaimella, verkon yli tämäkin onnistuu JavaScriptiä ja HTML5 käyttäen.
Kuulostaa hienolta - tosin ei aina - selaimissa ja asetuksissa on eroja Chrome soittaa parhaiten, Firefox ja Opera ei nyt niin kovin sulavasti, Explorer ... ei kokemusta.

Klikkaa ylempänä olevaa linkkiä ... (jos ei toimi, jokin plugini koneeltasi puuttuu silloin)

Tässä lisää linkkejä, periaate näissä on sama
(löytyy myös ylhäällä linkissä olevan sivun alareunasta) 


kuva: www.publicdomainpictures.net/   CC0 1.0 Universal

maanantai 14. heinäkuuta 2014

Hienoja kuvia GIMPillä


Tuli kokeiltua kuvankäsittelyä GIMP ohjelmalla ... ja kyllä aika näyttävää jälkeä saa aikaiseksi, kun vaan osaisi käyttää.

GIMP = GNU Image Manipulation Program, Gimp on myös vapaan lähdekoodin ohjelma.

Sen enempää ei nyt jäädä ihmettelemään tätä ohjelmaa, vaan kokeillaan heti mitä saadaan tehtyä.Vaikka sitä hienoa musta-valkoinen efektiä, missä on värillisiä yksityiskohtia.

Yllä oleva esimerkkikuva on tehty värikuvasta, joka on muutettu mustavalkoiseksi, ja värilliset osat 
yksinkertaisesti vaan "maalataan esille" muistista. 

Photoshop ohjelmassa tämä ominaisuus taitaa kulkea nimellä "History Brush"
Mutta Gimpissä ei ole mitään tällä nimellä ... tein tähän alle jonkinlaista ohjetta miten sen voisi tehdä.


  • Aluksi pitää tietenkin olla kuva joka avataan GIMPillä
  • Ohjelman ylärivistä etsi kohdat - Layer - Duplicate Layer 
  • Nyt pitäisi olla Layers ikkuna esillä ... jos ei ole paina Ctrl l


  • Layers ikkunassa pitäisi nyt olla sekä - Background copy että  Background layerit
  • Background copy- pitää olla valittuna.

  • Kuva muutetaan musta-valkoiseksi, ohjelman ylärivistä kohdasta Colors  - Desaturate

  • Layers ikkunassa, valittuna olevaa -Background copy- klikkaa sitä hiiren oikealla
  • Avaa sieltä - Add Layer Mask ja valitse - White (full opacity)

  • Nyt voidaan sitten ruveta maalaamaan, ja siihen tarvitaan pensseli
  • Työkalu ikkunasta valitaan pensseli, ja skaalaa se tarpeeksi isoksi
  • Tärkeää - työkalu ikkunassa on - foreground ja background optio (katso punainen ympyrä)


  • Aluksi pitää olla musta edustalla, ja tätä vaihtamalla voidaan maalata joko "väreillä" tai "musta-valkoisella" (vaihto tapahtuu helposti niistä pienestä nuolista) eli jos tulee levitettyä sitä väriä liian laajalle se voidaan maalata takaisin musta-valkoiseksi, nostamalla valkoinen edustalle.

  • Lopuksi, kun kuva tallennetaan, valitse ensin Layers ikkunasta vasemman puoleinen ruutu. 

keskiviikko 25. kesäkuuta 2014

Blogger Dynaamisen näkymän hammasrattaat


Bloggerin dynaaminen pohja on käytössä myös tällä blogilla, niistä muutamista puutteista huolimatta dynaamiset sivut on hienot, itse pidän näistä erittäin paljon.

Mutta voihan näitäkin tietysti myös muokata ... otetaan ensimmäiseksi kokeiluksi vaikka tämä.

Kun katselija selaa dynaamisia sivuja, niin jossain vaiheessa, aivan varmasti tulee se tuttu hammaspyörät pyörimään näytölle.
Koska myös kaikilla muillakin dynaamisia sivuja käyttävillä on samat hammasrattaat pyörimässä, niin tämä ominaisuus voidaan yksilöidä aika helposti, muutama rivi koodia ja gif kuva, siinä kaikki.

Aluksi etsitään paikka minne koodi liitetään.

Mallit - Mukauta - Lisäasetukset - Lisää CSS

Ja sinne ruutuun kopioidaan alla oleva koodi

  .blogger-gear, .overview-sspe {
  background-image: url('http://kuvan-polku.gif')!important;
  height: 80px !important;
  width: 80px !important;}

Kuva pitää ladata jollekin palvelimelle, joten kohtaan http://kuvan-polku.gif laitetaan url osoite. Lisäksi tärkeä on myös asettaa kuvan px eli pikseleiden arvot oikeaksi.
Tallenna ja tämän jälkeen meillä on sitten uusi kuva käytössä. 

Jos taas kuva halutaan kokonaan pois, kopioi tämä koodi:

  .ss,.blogger-gear{ display: none; }


maanantai 16. kesäkuuta 2014

RAMFS vs TMPFS

Ramfs ja Tmpfs (Unix) tiedosto systeemi.
Väliaikaisia tiedostoja jotka ovat tietokoneen kiintolevyn sijaan tietokoneen keskusmuistilla (ram muistilla), ja niitä käytetään aivan samalla lailla kuin muitakin tiedostoja.
Normaaliin kiintolevyyn verrattuna tiedostojen luku ja kirjoitus selvästi nopeutuu (jos liikutetaan paljon dataa) näitä käyttäessä etenkin jos kiintolevynä on esim. SD kortti. SD muistille kirjoittamista kannattaa muutenkin säästellä sen rajallisen ominaisuuden takia.

Kuitenkin nämä molemmat (ramfs ja tmpfs) muistit "haihtuu” tietokoneen sammuttaessa, joten tässä suhteessa ne ei voi korvata massamuistille kirjoittamista, vaan ne on ennemminkin tiedon väliaikaiseen varastoimiseen. Millä tapaa sitten ramfs ja tmpfs sitten eroaa toisistaan, jos kerran molemmat käyttää tietokoneen keskusmuistia ? Lähinnä siinä että tmpfs ei anna kirjoittaa ennalta määrättyä muistin koon yli, vaan antaa tästä virheilmoituksen, lisäksi tmpfs käyttää swap:pia …
Ramfs voi siis kirjoitaa vaikka koko keskusmuistin täyteen, tämän mukaan olisi siis parempi käyttää tmpfs.

Tehdään aluksi ramlevy, nimetään se esim. ”ramdisk”



 # mkdir -p /mnt/ramdisk

TMPFS luodaan

# mount -t tmpfs -o size=10m tmpfs /mnt/ramdisk

RAMFS luodaan näin

# mount -t ramfs -o size=10m ramfs /mnt/ramdisk

Nämä eroaa siis lähinnä mount käskyllä, (esimerkissä koko on 10 megaa)

mount -t [TYPE] -o size=[SIZE] [FSTYPE] [MOUNTPOINT]

Sitten kokeilemaan, aluksi kirjoitetaan vaikka 'hello' tiedostoon note

echo 'hello' > /mnt/ramdisk/note

ja luetaan

cat /mnt/ramdisk/note

***
Koska mounttaus joudutaan tekemään joka kerta kun tietokone käynnistetään,
kannatta tiedostoon  /etc/fstab lisätä rivi (alla joitakin esimerkkejä)

tmpfs  /mnt/ramdisk tmpfs size=10M 0 0
tai
tmpfs  /mnt/ramdisk tmpfs size=10M,mode=0777 0 0
tai
tmpfs  /mnt/ramdisk tmpfs nodev,nosuid,noexec,nodiratime,size=10M  0 0

torstai 8. toukokuuta 2014

Simple gstreamer ogg soitin 2


Edellisen artikkelin koodiin on nyt lisätty threadi jolla voimme keskeyttää / jatkaa soittoa.

Uusi koodi löytyy täältä.

Soiton keskeyttäminen tapahtuu p  ja  näppäin jatkaa soittoa.

---

Tässä nähdään molemmat funktiot ...  aika yksinkertaista sinänsä

void pause (void)
{
   if (pipeline) {
    g_print ("Pause\n");
    gst_element_set_state (pipeline, GST_STATE_PAUSED);
   }
}

void resume (void)
{
   g_print ("Resume\n");
    gst_element_set_state (pipeline, GST_STATE_PLAYING);
}


Ja se itse thread sitten ... puskuri ss on tarkoituksella kirjoitettu näin, myöhempää käyttöä varten.



void *thread1()    
{
  char ss[1];

while(1)  
  {
  gets(ss);
   if(ss[0]=='p')  /*  pause */
    pause ();
   else if(ss[0]=='r')  /* resume */
    resume();
  }
   
}


Seuraavassa artikkelissa kokeillaan hakea kappaleen pituutta ja siirtää positiota 

torstai 1. toukokuuta 2014

Simple gstreamer ogg soitin 1


Aikaisemmin kun puhuin Jolla puhelimen Midi soittimesta, jonka perustana on siis Wildmidi ja gstreamer, niin ennen kuin tutkitaan sitä tarkemmin, Gstreamer sivuilta löytyy esimerkki yksinkertaisesta soittimesta, jonka kääntämistä voisi kokeilla Jolla emulaattorissa tai puhelimessa. Tämä ei siis soita midiä, mutta .ogg tiedostot pitäisi pelittää.
Sivuilta löytyvä koodi löytyy myös täältä 
Kääntäminen on sinänsä aika simppeliä,  tässä tapauksessa käytetään Makefile:ä ja sitä kutsutaan komentorivillä komennolla make




----

CC=gcc

EXTRA_WARNINGS=-Wall -W -Wformat-nonliteral -Wcast-align -Wpointer-arith \
      -Wbad-function-cast -Wmissing-prototypes -Wstrict-prototypes \
      -Wmissing-declarations -Winline -Wundef -Wnested-externs -Wcast-qual \
      -Wshadow -Wwrite-strings -Wno-unused-parameter -Wfloat-equal -pedantic -ansi -std=c99

GST_LIBS=`pkg-config --libs gstreamer-0.10` -lgstinterfaces-0.10
GST_CFLAGS=`pkg-config --cflags gstreamer-0.10`

CFLAGS=-ggdb $(EXTRA_WARNINGS)

BINS=simple-player

all: $(BINS)

simple-player: simple.c
$(CC) $(CFLAGS) $(GST_CFLAGS) $(GST_LIBS) $+ -o $@

clean:
rm -rf $(BINS)

------

Jos kääntäminen onnistui ilman virheitä, meillä pitäisi olla nyt ohjelma nimeltä 
simple-player
soitetaan -  ./simple-player jokin-biisi.ogg   - Ctrl c keskeyttää.

Gstreamer on siis 0.10 versio, eikä 1.0, laitteessa voi olla molemmat versiot, kunhan vain käännettäessä käytetään samaa versiota.

torstai 10. huhtikuuta 2014

Kaukosäädin emulaattori 3

Aluksi siis meidän täytyy tallentaa kaukosäätimen sen painikkeen pulssit joita halutaan kopioida, ehkä kannattaa aloittaa jostain helposta, jokin kaukosäädin joka tuottaa vain vähän pulssia ulos ja jonka kantoaalto on tiedossa, esimerkissä on käytetty Philips matkaradion volume + nappulaa.
Nappia on painettu 4 kertaa noin sekunnin ajan jokaista painallusta.


Kolmas painallus näyttää hyvältä, joten muut voidaan hiirellä maalaten ja poistaa edestä että takaa, jolloin meille jää noin sekunnin pätkä. Tämä kannattaa sitten varmuudeksi tallentaa .wav tiedostoksi.
Audacity → Tiedosto → vie   remote1.wav



Seuraavaksi luomme uuden stereoraidan
Audacity →Raidat → Lisää uusi → Stereo Track

Stereoraitaan luodaan äänigeneraattorilla sävel oikealla taajuudella (kantoaalto)
Audacity → Luo → Sävel...


Ääniaalto = Kantti
Frequency= 19000 Hz
Amplitudi = 1
Kesto = 000,001 sekuntia

Taajuutena pitää siis olla puolet todellisesta ... eli 38000 / 2 = 19000
Kesto on ainoastaan 1 sekunti, pitempää ei nyt tarvita, mutta on hyvä jättää sinne alkuun vähän tyhjää ja miksei myös loppuun.
Eli nyt on jokin tämän näköinen kuva edessä
Ylhäällä olevassa monoraidassa on kaukosäätimen pulssit (yksi napin painallus)
Alempana stereoraita jonne on luotu 19 KHz sävel kanttiaaltoina


Seuraavaksi stereoraita pitää jakaa kahdeksi eri raidaksi, stereoraidan vasemmassa reunassa on valitsin "Audioraita" ja sieltä kohta "jaa stereoraita"
Audioraita  →  jaa stereoraita

Maalaa hiirellä toinen (ei väliä kumpi) näistä raidoista - alusta loppuun ... valitse
Audacity → Efekti → Vastaääni

Muuta takaisin stereoraidaksi
Audioraita  →  Yhdistä stereoraidaksi

Vastaäänellä saamme molemmat LEDit palamaan

Ctrl + hiiren rullaa pyörittämällä saadaan raita laajennettua

Kuvasta nähdään että aaltomuoto on vastakkainen, muuten täsmälleen samanlainen, mutta koska jako 44100 / 19000:lla ei mene aivan tasan, siksi siellä on pieniä virheitä, jotka näkyy myös kuvassa.
Lopulta sitten siirrämme kaukosäätimen pulssit stereoraitaan.
(projekti kannattaa tallentaa, ja tehdä välitallennuksia ...  kopioiminen on aika puuduttavaa)



Taas kuva kertoo paljon, stereoraitaan siis kopioidaan pulssit monoraidasta, tekemällä hiljaisuutta kantoaaltoon.

Valmis kopioitu raita.


Lopulta voimme tallentaa stereoraidan, muoto on siis  .wav
Audacity → Tiedosto → vie
Poista monoraita ennen tallennusta ... muuten se yhdistetään mukaan ?

-----

Seuraavaksi laitetta voi sitten testata käytännössä (käyttäjän omalla vastuulla), jos kaikki on mennyt oikein, tämän pitäisi pelittää heti ekalla, kuitenkin kohta huomataan että on aika tarkka suuntauksesta ... eikä kantama ole nyt niin hirveän pitkä, siksi ne LEDit pitää asettaa lähekkäin ja samaan linjaa.

Jos käy niin että välillä lähetys toimii ja välillä ei, niin volumea säätämällä voidaan kokeilla auttaako se säätö toimintaan ... se kun ei aina välttämättä ole se 100% .

Itselläni on käytössä juuri näin tehty IR lähetin jota ohjaa Raspberry Pi + USB äänikortti, ja tällä sitten ohjataan Daikin Ilma-vesilämpöpumpun Powerful tilaa päälle / pois.
Kantoaallon taajuus on 33KHz

Kuvassa LEDit ja vastaanottava silmä ei ole ihan samassa linjassa,
mutta on toiminut ilman virheitä

Näin lopuksi voisi todeta, jos kaukosäädin lähettää paljon dataa, näitten kopioiminen käsin on sitten aika aika työläs homma ... tähän voisi tietenkin kirjoittaa jonkin koodin joka tekisi tämän hetkessä.

tiistai 8. huhtikuuta 2014

Kaukosäädin emulaattori 2

Seuraavaksi sitten rakennetaan varsinainen IR lähetin, ja siihen me tarvitaan 2 kpl IR LED:jä, ja johto jonka päässä on 3,5mm stereo jack liitin.

Kuva kertoo kaiken ... kytkentä on todella yksinkertainen.
 Sinänsä ei pitäisi olla väliä onko kytketty juuri noin kuten kuvassa, katodi punaisessa (vasen) anodi vihreässä (oikea kanava), mutta keskellä olevat anodi ja katodi pitää liittää yhteen. Maata ei tarvitse kytkeä.

Miksi tarvitaan kaksi LEDiä ?
Koska äänikortti pystyy parhaimmillaan 44100 Hz taajuuteen, yhdellä LEDillä ei silloin voida näyttää kuin 22050 Hz taajuutta, ja yleinen kantoaallon taajuus kun on se 38000 Hz eli 38Khz. Samalla huomataan ettei myöskään pystytä emuloimaan yli 44,1Khz taajuudella toimivia kaukosäätimiä.



Tarvitaanko vastusta ? ... ainakin omien kokemusten mukaan ei tarvita, mutta jos tätä kokeillaan esim. Raspberry Pi:ssä niin sen äänipiiri on sen verran heikko että tarvitaan ennemmin tehokkaampi äänikortti.

Olisi hyvä saada LEDit mahdollisimman lähelle toisiaan, ehkä viilalla viilata LEDin kanttia pois, jolloin ne menee lähemmäksi toisiaan, ja ehkä oli hyvä idea juottaa LEDit piirilevyyn.


Rakennelman voi sitten testata vaikka puhelimen kameralla, johto tietokoneeseen kiinni, pistetään jotakin soimaan, puhelimen kamera valokuvaus valmiuteen, ja näytön läpi sitten katsotaan LEDejä, molemmat LEDit pitäisi palaa.

Seuraavaksi sitten Audacity ohjelmalla tehdään se varsinainen soitettava .wav tiedosto

maanantai 7. huhtikuuta 2014

Kaukosäädin emulaattori 1

Jos tarkoituksena on rakentaa oma kaukosäädin, esim. tietokoneohjattu lähetin jolla ohjataan jotain laitetta, jota siis normaalisti ohjataan laitteen omalla kädessä pidettävällä kaukosäätimen, ja tämä toiminta halutaan automatisoida. Tähän varmaan löytyy valmiita palikoita, mutta nyt kokeillaan hommaa todella halvalla ... muutamalla €

Eli miten kopioidaan kaukosäätimen IR koodi ja miten se toistetaan ... ja vielä yksinkertaisella tavalla.

Kaukosäädin lähettää IR eli infrapunavaloa, ja tässä valossa (kun painamme nappi) on kantoaalto sekä varsinainen ohjauskoodi. Tämän kopioiminen ja muokkaaminen WAV tiedostoksi onnistuu sinänsä aika helposti,  kantoaalto kuitenkin täytyy saada aluksi jostain selville,  38Khz on aika yleinen, mutta voi olla jokin muu väliltä 30-60Khz. eli tämä tieto joudutaan etsimään jostain.

Ideana on siis lukea IR koodi äänitiedostoksi, muokata ja tallentaa se wav tiedostoksi, "soittaa" ulos kahta infraLEDiä käyttäen.

Koodin kopioimiseen käytetään valotransistoria, juotetaan se johtoon jonka toisessa päässä on 3,5 mm jack liitin, joka sitten kytketään tietokoneen äänikortin mikrofoni liittimeen.
Lisäksi tarvitsemme Audacity ohjelman. (onnistuu ehkä jollain muullakin ohjelmalla)
Audacity on Linux, Mac että Windows alustalle
----

Aluksi siis tarvitsemme valotransistorin , ei sinänsä väliä kunhan on herkkä infravalolle eli noin 900nm, juotamme sen 3,5mm liittimellä varustettuun johtoon, virta ja maajohdon väliin, siihen toiseen johtoo ei liitetä mitään.

huom. kaikki sitten käyttäjän omalla vastuulla :-) 

Tämä kytketään tietokoneen äänikorttin mikrofoni liittimeen. (se vaalenapunainen)
Audacity ohjelmalla äänittämällä sitten kopioidaan kaukosäätimen jonkin nappulan signaalit.
Jolloin saadaan ulos sitten näin hienoa kuviota

(katso että äänitystaso on tarpeeksi korkealla)

Kaukosäätimen näppäintä on kuvassa painettu 4 kertaa.


täytyy myös muistaa että jollakin nappulalla voi olla kaksi tarkoitusta, esim. ensimmäisellä kerralla painaessa ON toisella kerralla OFF kolmannella taas ON

Jatkuu myöhemmin osassa 2


torstai 20. helmikuuta 2014

Sailfish Midi 1


Tässä on tullut jo jonkin aikaan etsittyä sopivinta vaihtoehtoa Midi tiedostojen soittoon  tässä järjestelmässä.
Joskus ammoisina aikoina äänikorteissa löytyi midi jo ihan rautatavarana, mutta nykyään äänet tehdään ohjelmallisesti soundfontteja käyttäen. Äänifontteja tarvitaan eri instrumenteille, näillä juuri esim. piano saadaan kuulostamaan pianolta.

Mitään valmista systeemiä ei tähän löydy, mutta vaihtoehtoja mistä rakentaa on kyllä olemassa.

  1. Käännetään jokin vanha kunnon software syntetisaattori tähän järjestelmään, plus kaikki ne miljoona kirjastoa, esimerkiksi FluidSynth
  2. Yritetään löytää gstreamer pluginit, tosin voi olla että tämäkin vaatii jonkin soft.synthin
  3. JavaScript soft.synth Jasmid on mielenkiintoinen tuttavuus, ohjelma toimii selaimessa, ja äänitiedostot löytyy htlm tiedoston sisällä. Mutta ikävä kyllä Sailfish selain ei oikein "tahdista" ääniä ... itseasiassa en ole saanut mitään ääniä tulemaan ulos MIDI.js ja Jasmidia käyttäen, puuttuu web audio api, mutta kokeilin desktop versiona QML selaimella soittaa midä .. niin ei oikein innostanut.
    Sinänsä olisi kuitenkin mielenkiintoinen vaihtoehto, koska tällä voisi yhdistää grafiikkaa ja ääntä, ja vieläpä yli-verkon.
Jos käännetään jokin ohjelma ja tehdään rpm paketti, niin ensimmäisenä tulisi mieleen WildMidi, vähäisten resurssien takia tämä olisi ehkä sopivin.

CPU käyttöaste eri ohjelmilla 

6 %  -WildMIDI
68 % -FluidSynth + pulseaudio
16% -Timidity + pulseaudio
56% - JavaSound (ei JavaScript)
17% - GStreamer

Lisäksi WildMidiin löytyy gstreamer plugin.

gst-launch-0.10 filesrc location="song.mid" ! decodebin ! alsasink
----
Projekti on nyt siinä vaiheessa, että Wildmidi on asennettu Timidityn äänifonteilla, koska se käyttää niitä kun WildMidi äänifontteja ei ole olemassakaan, myös voisi kokeilla freepatch fonteilla.
lisäksi  gstreamer0.10-wildmidi plugin on asennettu (Sailfish:ssä on gstreamer 0.10 versio).


Ja hienostihan se soi!
Mutta vielä puuttuu joitakin osia, esim. konsoliohjelmaa ei ole asennettu, mutta sitä ei välttämättä edes tarvita, tämä riippuu ihan gstreameristä.

Python käynnistää soittamisen subprocess.Popen(Gst_litany)

gst-launch-0.10 filesrc location="song.mid" ! wildmidi ! audiopanorama panorama=+0.00 ! volume volume=0.2 ! alsasink

panorama=-0.50 tai simple panorama=-0.50

Stereo panoraama efekti sekä siintä simple versio jossa ainoastaan oikean ja vasemman kanavan tehoa säädellään esim. -0.50 silloin vasen kanava kuuluu voimakkaammin suhteessa oikeaan. 1.00 on maksimi. Jolla puhelin taitaa kuitenkin olla mono, joten tällä ei itse puhelimessa niin suurta merkitystä, mutta silloin kun otetaan bluetooth yhteys ulkoiseen kaiuttimeen.
Midissä on tärkeää että kappaletta voidaan soittaa mistä kohdin tahansa, ja tämä on projektin seuraava haaste.

Tähän kyllä löytyy elementti nimeltä "gnlfilesource" jolla voidaan asettaa positio ja pituus mihin kohtaan muistia tahansa, jotenkin näin,

gst-launch-0.10 gnlfilesource location=file:///hillbilly.mid ! wildmidi ! media-start=0 media-duration=20000000000 ! alsasink



mutta eihän tämä tietenkään toimi .mid tiedostoilla wildmidin kanssa ... wav toimii kyllä.
Joten tähän sitten koodataan oma ohjelma ja unohdetaan gst-launch, ja myös syystä että gst-launch on aika staattinen ... (vs. gst-client) .

Eli tähän koodataan oma ohjelma ... miksei sitten jokin valmis kelpaa ?
Aluksi täytyy olla kirjastot:
PyGST  taitaa olla koodattu Python 2.7, ainakin gstreamer-0.10 versio ja muutenkin aivan liian iso paketti asennettavksi, samoin kuin qt5-gstreamer, ja kun ne vielä pitäisi aluksi kääntää tähän ympäristöön.

joten tästä aloitetaan koska nämä on jo valmiina
#include <gst/gst.h>
#include <glib.h>

Täältä löytyy esimerkki hyvin yksinkertaisesta ohjelmasta, mitä voi käyttää pohjana
simple-player

-------------------------
HTML5 tiedoston kautta voidaan myös toistaa midiä jos tarvittavat pluginit on asennettu, mutta tässä tulee selaimen tuki esille, kappaletta kun on myös kyettävä muokkaamaan.

Lisäksi varsinainen midi sävellysohjelmaa ei ole edes aloitettu... ja se tehdään myös Pythonilla.




torstai 13. helmikuuta 2014

Sinatra

Sinatra doesn't know this ditty.

Try this:

get '/C/targets/SailfishOS-i486-x86/*' do
  "Hello World"
end




torstai 16. tammikuuta 2014

Sailfish ja HTML5

Yksi mielenkiintoisempia asioita koodaamisen rintamalla on HTML5, tätä kun voi myös käyttää perinteisen ohjelmoinnin apuna, ilman että aina täytyy asentaa kaikenmaailman kirjastoja koneelle ja koodailla päiväkausia, selain hoitaa homman, ei muuta kuin pari riviä koodia ja homma on siinä ... tai melkein, asiat kun ei ole vielä näin hienosti, esimerkiksi jotkin aikakriittiset jutut, vaikka pätkivä ääni voivat himmentää tätä iloa. (ja tästä vähän myöhemmin lisää)
Itse HTML5 on vasta tekemässä tuloaan.

Koska selain ajaa HTML5 koodia, niin silloin selaimen tuella on merkitystä, sama ohjelma voi myös toimia erillä tapaa eri selaimessa.

Tässä muutama koodirivi,  ohjelma palauttaa WebView avatun "selaimen" HTML5 tuen ... tämä siis verkon yli... (Vaihtoehtoisesti SilicaWebView)

import QtQuick 2.0
import QtWebKit 3.0
import Sailfish.Silica 1.0

Page {

WebView {
 
    anchors {
        top: parent.top
        left: parent.left
        right: parent.right
        bottom: parent.bottom
          }

    url: "http://html5test.com/qr.html"  
}
}

Tai sitten itse puhelimessa: selaimeen osoite http://html5test.com/qr.html

torstai 2. tammikuuta 2014

Sailfish ja PyOtherSide - esimerkki



Kun teemme Sailfish ohjelmia niin käytämme Qt Creatoria ja QML ohjelmointikieltä, koska QML ei ihan kaikkeen sentään taivu, niin apuna on yleensä C++ ,  mutta hyvä on myös tietää että Pythonia on myös mahdollisuus käyttää C++ tilalla.

Qt Creatorin mukana ei kuitenkaan tule Python editoria, vaan meidän on asennettava siihen PyQt.
On myös olemassa vaihtoehto tälle eli PyOtherSide, jota ei kuitenkaan kiinnitetä mitenkään Qt Creator:in toisin kuin PyQt , vaan pelkästään ladataan emulaattoriin, sekä tämän lisäksi myös Python 3.3  (toki myös näin on tehtävä itse laitteeseen)

PyOtherSiden käyttö siis tarkoittaa ettei Qt Creatorista tule varsinaista Python editoria, mutta koska Qt Creator kuitenkin sallii myös muitten kun .qml tiedostojen liittämisen projektiin (ja tämä on suuri apu) voimme koodata Python tiedostoa samalla kun koodaamme QML tiedostoa, kunhan koodaaja vaan itse hallitsee Pythonin sisennykset.
Pythonia kutsutaan silloin QML komponentista nimeltä Python.

Mer wikin mukaan Sailfish Harbour tulee tukemaan PyOtherSide:a.

Kokeillaan  miten tämä toimii, tehdään pieni ohjelma jossa käytämme Pythonia apuna. Esimerkissä soitamme jolla-ringtone.wav tiedoston, ja ProgressBar (Sailfish.Silica komponentti) liukuu soiton edetessä ... tähän käytämme Pythonia, haemme sillä kappaleen keston.
---------
Aluksi:
(katso ylempänä olevaa Mer linkkiä, itse asensin kuitenkin zypperin emulaattoriin:  pkcon install zypper)

kirjaudu emulaattoriin: ssh -p 2223 nemo@localhost

asenna emulaattoriin:

zypper ar http://repo.merproject.org/obs/mer-python3/latest_i486/mer-python3.repo
zypper in python3-base
zypper in pyotherside-qml-plugin-python3-qt5

Varmista että python3 toimii
Siirrä jokin soitettava .wav tiedosto ~/Music/ hakemistoon

(/usr/share/sounds/jolla-ringtones/stereo/jolla-ringtone.wav)
--------

Editorissa:
Luodaan uusi projekti -- SailfishOS Qt Quick application
Projektin SecondPage.qml kopio alla oleva  koodi

import QtQuick 2.0
import Sailfish.Silica 1.0
import QtMultimedia 5.0
import io.thp.pyotherside 1.0

Page {

    property string sound_name: "jolla-ringtone.wav"
    property string sound_path: "/home/nemo/Music/"
//-------
    Text {
        id:input
        text: "<b>"+sound_name+"</b><br><i> .. press me ..</i>"
        color: "yellow"
        font.pointSize: 24
        anchors.centerIn: parent
        MouseArea {
            anchors.fill: parent
            onPressed:{
                       playMusic.play()
                       bar.value = 0; bar._timer.running = true
                       input.color = "steelblue"
                       input.text = "<i>"+sound_name+"</i>"}
                 }
    }
//------------
   Python {
           id:py
           Component.onCompleted: {

               addImportPath(Qt.resolvedUrl('.').substr('file://'.length));

               importModule('duration', function() {
                   call('duration.read_header',[sound_path+sound_name],function(result){
                      playMusic.source = "file:///"+sound_path+sound_name
                      bar._timer.interval = result;

                   });
               });
           }
           onError: console.log('Python error: ' + traceback)
       }

//---------------
        SoundEffect {id: playMusic }

//-----------------
             ProgressBar {
                 id : bar
                 anchors.fill: parent
                 minimumValue: 0
                 maximumValue: 100
                 valueText: value + "%"
                  _timer.repeat: true
                  _timer.running: false
                  _timer.onTriggered: {
                     bar.value ++;
                     if (bar.value == 100) { _timer.running = false;
                         if (playMusic.playing == false) { bar.value = 0 }
                 }
                          }

             }
//------------------
}

Kohta: property string sound_name: "jolla-ringtone.wav"
Korjaa tähän sen tiedoston nimi mitä käytät
-----
Itse Python tiedosto lisätään editorin vasemmassa ylälaidassa olevassa hakemistopuun kohtaan 

Other files -- qml/pages

Hiiren oikealla --- add new
Python -- Python source file
Anna tiedostolle nimi -- duration.py
Polun loppuosa pitää olla   ~/qml/pages
Lataa alla oleva koodi

duration.py
---------
import os
import struct
import pyotherside

def read_header(wav_file):

    try:
        handled_file = open(wav_file, 'rb')
    except IOError:   #, err:
        return ("tiedostoa %s" % (wav_file)+" .. ei ole")

    buffer = handled_file.read(38)
    # varmista tiedosto
    if (buffer[0:4] != b"RIFF") or (buffer[12:16] != b"fmt "):
         return ("ei standardi WAV tiedosto")

    by_rate = struct.unpack('<L', buffer[28:32])[0] # Bytes/Second


    # lue datalohkot

    Alfa = 0
    handled_file.seek(0, 2) # tiedoston lopusta
    FileSize = handled_file.tell()

    Position = 12 # jump > WAVE

    while 1:
        # alilohko
        handled_file.seek(Position)
        buffer = handled_file.read(8)
        if buffer[0:4] == b"data":
           Alfa = Position
            break
        Position += (8 + struct.unpack('<L', buffer[4:8])[0])
        if Position >= FileSize:
            break


#--- shown pituus sek.
    if Alfa != 0:
        handled_file.seek(Alfa)
        buffer = handled_file.read(8)
        size = int("%s" % struct.unpack('<L', buffer[4:8]))
        size = int((size / by_rate)*10) # x 10
        handled_file.close()

        return size      #size
    else:
        return 0

pyotherside.atexit(read_header)

-----------------------

Tallenna ja aja ctrl-r

Python lukee .wav tiedoston headerin, ja sieltä etsii soitettavan datan koon, joka sitten jaetaan byte per sekunti arvolla x 10, tulos on pyöristetty kokonaisluku ja annetaan ProgressBar:lle 
bar._timer.interval = result

Kun Python funktiota kutsutaan, se tapahtuu QML koodissa.

call ('duration.read_header',[sound_path+sound_name],function(result)

duration.read_header =  duration tiedostosta read_header funktio

parametrit funktiolle annetaan [] lista merkkien sisällä