Page 1 of 1

cbSound&Music

Posted: Thu Jun 10, 2010 5:10 pm
by Latexi95
Pitkästä aikaa saan, jotain näytille...
Tällä kertaa tarjolla on tälläinen pieni musiikkin-/äänenhallintakirjasto, joka sisältää funktiot
pelin taustamusiikin soittolistan tekoon sekä wav-tiedostojen avaamiseen.
Pidemmittä puheitta funktioiden esittelyyn.

Wav:n hallinta.
  • wav = SM_OpenWav(path$)
    Avaa wav-tiedoston(path$) ja tallentaa sen muistipalaan(wav)
  • sr = SM_GetSampleRate(wav)
    Lukee muistipalasta(wav) äänen näytteenottotaajuuden(sr).
  • c = SM_CountChannels(wav)
    Lukee muistipalasta(wav) äänikanavien(c) määrän (1 = mono, 2 = stereo).
  • raw = SM_GetChannelRawData(wav,channel = 1)
    Hakee muistipalasta(wav) kanavan(channel) raakadatan ja tallentaa sen muistipalaan(raw).
  • SM_SetChannelRawData(wav,data,channel = 1)
    Tallentaa muistipalaan(wav) toisesta muistipalasta(data) saatavan raakadatan halutulle kanavalle(channel).
  • length# = SM_GetLength(wav)
    Hakee muistipalasta(wav) äänen pituuden(lenght#) sekunteina.
  • SM_WriteWav(path$,samplerate,data1,data2=0)
    Luo wav-tiedoston ilmoitettuun tiedostopolkuun(path$) valitulla näytteenottotaajuudella(samplerate)
    raakadatojenpohjalta
  • SM_SaveWav(path$,wav)
    Tallentaan aiemmin avatun wav-muistipalan(wav) tiedostopolkuun(path$).
  • SM_MakeWav(channels = 1,samplerate = 16000)
    Luo wav-muistipalan määritelemäläsi kanava määrällä(channels) ja näytteenottotaajuudella(samplerate)
Sitten pientä selostusta, että muokkaaminen onnistuisi helposti:
Näytteenottotaajuus on se määrä kuinka monta näytettä pitää lukea sekunnissa,
että ääni kuulostaa oikealta. Se on yleensä 8000Hz,16000Hz,44100Hz tai 48000Hz.
Jos suurennat tätä alkuperäisestä niin ääni hidastuu ja jos pienennät niin se vastaavasti nopeutuu.
Raakadata tallennetaan muistipalaan kokonaislukuina, riippumatta siitä miten se oli tallennettu alunperin.

Muutama esimerkki:
Muutetaan näytteenottotaajuus:

Code: Select all

Include "cbSound&Music.cb"
wav = SM_OpenWav("C://APPS/Coolbasic/Media/Prop dive 2.wav") //Avataan wav
SM_SetSampleRate(wav,SM_GetSampleRate(wav)/2) //Tupla nopeus
SM_SaveWav("testi.wav",wav)
PlaySound "testi.wav"
WaitKey
DeleteFile "testi.wav"
Ääni kuvaksi:

Code: Select all

Include "cbSound&Music.cb"

SCREEN 800,400
wav = SM_OpenWav("Media/Prop dive 2.wav") //Avataan wav
rawdata = SM_GetChannelRawData(wav)//Haetaan data

length = MEMBlockSize(rawdata) //Muistipalan koko
keskiarvo = i2 = i3 = 0
For i = 0 To length - 4 Step 4
    PokeFloat rawdata,i,PeekInt(rawdata,i)/2147483647.0 //Muutetaan arvot sopivammiksi
Next i
x = MouseMoveX() : y = MouseMoveY() //Nollataan
x = 0
y = 200
Zoom# = 1.0
Repeat
    lasty = y
    Color cbWhite
    Line 0,y+Zoom#*200.0,800,y + Zoom#*200.0 //Maksimi
    Line 0,y-Zoom#*200.0,800,y - Zoom#*200.0
    Color cbRed
    For i = 0 To length - 4 Step 4
        y2 = y+PeekFloat(rawdata,i)*Zoom#*200.0
        Line x+(i-4)*Zoom#,lasty,x+i*Zoom#,y2
        lasty = y2
    Next i
    mx = MouseMoveX()
    my = MouseMoveY()
    If MouseDown(1) Then x = x + mx : y = y + my
    Zoom# = Max(Zoom# + Zoom# * MouseMoveZ()/10,0.1)
    DrawScreen
Forever
Soittolistat:
  • music = SM_AddToPlayList(path$,class$,length,maxvolume = 100)
    Luo uuden jäsenen soittolistaan.
    path$ = Tiedostopolku jossa kappale on.
    class$ = Kappaleen luokka esim. "peli" tai "valikko"
    length = kappaleen pituus millisekunteina (ei silti tarvitse olla niin tarkka luku)
    maxvolume = maksimi volumi
    music = Kappaleen muuttuja
  • SM_UpdateMusic()
    Päivittää musiikin toiston
  • SM_ChangeMusic(music,changeclass = true)
    Vaihtaa toistettavan kappaleen välittömästi.
    music = Kappale joka toistetaan seuraavaksi.
    changeclass = Vaihdetaanko soittoluokka kappaleen mukaan?
  • SM_PlayNext()
    Toistaa seuraavan kappaleen.
  • SM_StopMusic()
    Pysäyttää kappaleen toiston.
  • SM_ContinuePlaying()
    Jatkaa toistamista
  • SM_SetClass(class$)
    Vaihtaa välittömästi toistoluokkaa.
    class$ = Luokan nimi, jonka kappaleita soitetaan seuraavaksi tai
    kappale, jonka luokkaa käytetään.

    Vakiot:
  • SM_QuietDown
    Millisekunteina kuinka pitkä on hiljentymis aika.

    Globaali muuttujat:
  • SM_CurrentMusic
    Tällä hetkellä toistettava musiikki.
    Älä muuta tätä! Käytä siihen mielummin "SM_ChangeMusic" funktiota.
  • SM_NextMusic
    Seuraavana soitettava musiikki.
    Nolla, jos valitaan seuraava kappale soittolistalta.
  • SM_CurrentClass$
    Tällä hetkellä käytössä oleva luokka.
Soittolistaan lisätyillä kappaleilla on oma luokkansa jonka mukaan niitä toistetaan.
Sopivia luokkia ovat esim. "peli", "valikko" ja "asetukset". Kun pelissä siirrytään esim. valikkoon,
niin komennetaan "SM_SetClass("valikko")" ja musiikki hiljenee ja seuraavaksi alkaa kuulua valikon musiikki.
En tehnyt tästä esimerkkiä toivon, että tajusitte toiminnan.

Pieni varoitus: Testaus ei ole ollut kovin tehokasta joten bugeja löytyy varmasti.
Korjailen niitä sitä mukaa kun niitä ilmenee.

Kirjastoon pitäisi tulla lisää ominaisuuksia ainakin wav:n muokkaukseen,
että kaikkea muokkausta ei tarvitsisi tehdä muistipalojen käsittelyn avulla.

Versio: 1.01
Changelog:

Code: Select all

1.01:
-Lisätty virheen tarkistus "SM_OpenWav" ja "SM_AddToPlayList" funktioihin.
-Lisätty "SM_MakeWav" funktio
EDIT:

Taitaa olla pisin kirjoittamani viesti koskaan. :D

EDIT:

Niistä bugeista puheenollen: se yksi joka ehti jo ladata tämän, voisi ladata sen uudestaan
koska "SM_SaveWav":ssa oli pahasti vikaa, mutta se on nyt korjattu.


Re: cbSound&Music

Posted: Thu Jun 10, 2010 6:39 pm
by Herra HoOpO
Olenko aivan väärässä, vai pystyykö ensin luoda äänen, tallentaa sen muistinpalaan, ja lopuksi tallentaa Waviksi tuon härpäkkeen avulla? :?:

Re: cbSound&Music

Posted: Thu Jun 10, 2010 6:50 pm
by MaGetzUb
Ihan jees settiä, vielä vain vähän laajempia äänitiedoston hallintaa, nimittäin tuo wav kun ei ole mikään maailman parhain ainakaan koon suhteen. ;) Mp3, OGG, Wma olisi hyvä lisä, tosin voivat olla vain vähän hankalia. :)

Re: cbSound&Music

Posted: Thu Jun 10, 2010 7:06 pm
by Latexi95
Herra HoOpO wrote:Olenko aivan väärässä, vai pystyykö ensin luoda äänen, tallentaa sen muistinpalaan, ja lopuksi tallentaa Waviksi tuon härpäkkeen avulla? :?:
Et ole väärässä, kyllä.
MaGetzUb wrote:Ihan jees settiä, vielä vain vähän laajempia äänitiedoston hallintaa, nimittäin tuo wav kun ei ole mikään maailman parhain ainakaan koon suhteen. ;) Mp3, OGG, Wma olisi hyvä lisä, tosin voivat olla vain vähän hankalia. :)
Ongelma on siinä, että nuo ehdottamasi ovat muodot ovat pakattuja, joten pitäisi ensiksi tehdä purku algoritmi.
Voin silti yrittää tehdä, jos löydät selkeät ohjeet niiden purkamiseen ja pakkaamiseen. ;)

Re: cbSound&Music

Posted: Thu Jun 10, 2010 7:23 pm
by MaGetzUb
Latexi95 wrote:Ongelma on siinä, että nuo ehdottamasi ovat muodot ovat pakattuja, joten pitäisi ensiksi tehdä purku algoritmi.
Voin silti yrittää tehdä, jos löydät selkeät ohjeet niiden purkamiseen ja pakkaamiseen.
Joo, olisi nimittäin melko kätevät systeemit sitten. Voisihan sitä googlettaa, jos löytyisi edes lame_encode(.mp3) kirjaston dokumentaatio.

Hei mutta koodistasi sen verran, että kannattaa ensin tarkistaa onko tiedostoa olemassa FileExsists:llä. ;) Ei ole kiva lukea äänitiedostoa avatessa, että OpenToRead failed. :P

Re: cbSound&Music

Posted: Thu Jun 10, 2010 7:32 pm
by Latexi95
MaGetzUb wrote: Hei mutta koodistasi sen verran, että kannattaa ensin tarkistaa onko tiedostoa olemassa FileExsists:llä. ;) Ei ole kiva lukea äänitiedostoa avatessa, että OpenToRead failed. :P
Oletan nyt, että viittaat kirjastoon etkä esimerkkeihin. Minun mielestäni se on aina turhaa, koska voit tehdä sen tarvittaessa ennen kuin kutsut "SM_OpenWav":a.

Re: cbSound&Music

Posted: Thu Jun 10, 2010 10:35 pm
by valscion
Latexi95 wrote:
MaGetzUb wrote: Hei mutta koodistasi sen verran, että kannattaa ensin tarkistaa onko tiedostoa olemassa FileExsists:llä. ;) Ei ole kiva lukea äänitiedostoa avatessa, että OpenToRead failed. :P
Oletan nyt, että viittaat kirjastoon etkä esimerkkeihin. Minun mielestäni se on aina turhaa, koska voit tehdä sen tarvittaessa ennen kuin kutsut "SM_OpenWav":a.
Jep, ei kirjastossa minunkaan mielestäni tulisi suorittaa tiedostotarkastuksia. Sen pitäisi jäädä koodaajan itsensä harteille, että tarkistaa lataamansa äänitiedoston olevan todellakin olemassa.

Re: cbSound&Music

Posted: Thu Jun 10, 2010 10:40 pm
by esa94
Latexi95 wrote:Voin silti yrittää tehdä, jos löydät selkeät ohjeet niiden purkamiseen ja pakkaamiseen. ;)
Libvorbis OGG Vorbisille, lame mp3:lle. WMA taas on Mikkisoftan omaa kamaa, sille ei taida olla avoimia kirjastoja.

Re: cbSound&Music

Posted: Thu Jun 10, 2010 11:35 pm
by Latexi95
esa94 wrote:
Latexi95 wrote:Voin silti yrittää tehdä, jos löydät selkeät ohjeet niiden purkamiseen ja pakkaamiseen. ;)
Libvorbis OGG Vorbisille, lame mp3:lle. WMA taas on Mikkisoftan omaa kamaa, sille ei taida olla avoimia kirjastoja.
Vaikka olisi kuinka hyvät ohjeet, hankalaa on ja aikalailla turhaa. Dll:n tekeminen
taitaa olla parempi vaihtoehto, joten sitä väsäämään... :D

Re: cbSound&Music

Posted: Thu Jun 10, 2010 11:55 pm
by esa94
Latexi95 wrote:
esa94 wrote:
Latexi95 wrote:Voin silti yrittää tehdä, jos löydät selkeät ohjeet niiden purkamiseen ja pakkaamiseen. ;)
Libvorbis OGG Vorbisille, lame mp3:lle. WMA taas on Mikkisoftan omaa kamaa, sille ei taida olla avoimia kirjastoja.
Vaikka olisi kuinka hyvät ohjeet, hankalaa on ja aikalailla turhaa. Dll:n tekeminen
taitaa olla parempi vaihtoehto, joten sitä väsäämään... :D
Totta kai pitää tehdä DLL, eivät nuo kirjastot mitenkään tue CB:n DLL-käyttöliittymää. Joku wrapperi noille kaikille olisi jänskä.

Re: cbSound&Music

Posted: Fri Jun 11, 2010 12:27 am
by MaGetzUb
VesQ wrote:
Latexi95 wrote:
MaGetzUb wrote: Hei mutta koodistasi sen verran, että kannattaa ensin tarkistaa onko tiedostoa olemassa FileExsists:llä. ;) Ei ole kiva lukea äänitiedostoa avatessa, että OpenToRead failed. :P
Oletan nyt, että viittaat kirjastoon etkä esimerkkeihin. Minun mielestäni se on aina turhaa, koska voit tehdä sen tarvittaessa ennen kuin kutsut "SM_OpenWav":a.
Jep, ei kirjastossa minunkaan mielestäni tulisi suorittaa tiedostotarkastuksia. Sen pitäisi jäädä koodaajan itsensä harteille, että tarkistaa lataamansa äänitiedoston olevan todellakin olemassa.
Mitä ihmeen sekoilua tämä nyt on? Tarkoitin, että tuollaisessa tiedoston avaus funktiossa olisi hyvä tarkistaa, onko avattava tiedosto olemassa. Jos ei ole, niin voitaisiin pukata erroria "SM_OpenWav failed! File: blaa blaa not found!" Ihan vain sen takia, että jos on itse typottanu kirjoittaessa kun wavia avataan. Sitäpaitsi voi olla samassa koodissa muitakin opentoread kutsuja kuin vain pelkän kirjastosi 'SM_OpenWav' funktiossa. :x
EDIT:

Jos siis aiotaan olla käyttäjä ystävällisiä.


Re: cbSound&Music

Posted: Fri Jun 11, 2010 12:53 am
by esa94
MaGetzUb wrote:
EDIT:

Jos siis aijotaan olla käyttäjä ystävällisiä.

aiotaan*

Re: cbSound&Music

Posted: Fri Jun 11, 2010 9:49 am
by Latexi95
MaGetzUb wrote: Mitä ihmeen sekoilua tämä nyt on? Tarkoitin, että tuollaisessa tiedoston avaus funktiossa olisi hyvä tarkistaa, onko avattava tiedosto olemassa. Jos ei ole, niin voitaisiin pukata erroria "SM_OpenWav failed! File: blaa blaa not found!" Ihan vain sen takia, että jos on itse typottanu kirjoittaessa kun wavia avataan. Sitäpaitsi voi olla samassa koodissa muitakin opentoread kutsuja kuin vain pelkän kirjastosi 'SM_OpenWav' funktiossa. :x
EDIT:

Jos siis aiotaan olla käyttäjä ystävällisiä.

Voit lisätä sen sinne itse jos koet sen tarpeelliseksi, mutta
minusta kirjaston ei tule vahtia koodaajan virheitä.
Tämä vain "SM_OpenWav":n ensimmäiselle riville:

Code: Select all

If FileExists(path$) = false then MakeError "SM_OpenWav failed! File: "+path$+" not found."
Mutta tämä on lähes turha, koska tätä todennäköisesti käytetään vain musiikin muokkausohjelmissa,
joissa ohjelman ei haluta kaatuvan jos käyttäjä laittaa väärän tiedostopolun, ja sen takia tiedoston
olemassa olo tarkistetaan kuitenkin, joten tuo on täysin turha.

Re: cbSound&Music

Posted: Fri Jun 11, 2010 10:10 am
by Someday coder
Oma mielipiteeni koskien tuota käyttäjäystävällisyyttä on sama kuin magetzubilla, eli jos joku tekee ohjelman, joka on 1000 riviä pitkä ja käyttää tätä kirjastoa ja sen funktioita, niin aikamoinen korjaustyö edessä sitten.

Re: cbSound&Music

Posted: Fri Jun 11, 2010 12:44 pm
by Latexi95
Someday coder wrote:Oma mielipiteeni koskien tuota käyttäjäystävällisyyttä on sama kuin magetzubilla, eli jos joku tekee ohjelman, joka on 1000 riviä pitkä ja käyttää tätä kirjastoa ja sen funktioita, niin aikamoinen korjaustyö edessä sitten.
Miten niin korjaustyö? Tuskin sinä 1000 koodiriviä kirjoittaisit ilman, että tarkistaisit onko jokin
tiedosto olemassa. Voit joka tapauksessa laittaa tarkistuksen omaan koodiisi jos sitä vaaditaan.
Päätän suosia tätä "kokeneempien koodaajien" linjaa eli ei virheen tarkistusta, koska
kirjasto on pää asiassa tarkoitettu kokeneille koodaajille, jotka hallitsevat mm. muistipalojen käytön.

Re: cbSound&Music

Posted: Fri Jun 11, 2010 4:46 pm
by valscion
Latexi95 wrote:
Someday coder wrote:Oma mielipiteeni koskien tuota käyttäjäystävällisyyttä on sama kuin magetzubilla, eli jos joku tekee ohjelman, joka on 1000 riviä pitkä ja käyttää tätä kirjastoa ja sen funktioita, niin aikamoinen korjaustyö edessä sitten.
Miten niin korjaustyö? Tuskin sinä 1000 koodiriviä kirjoittaisit ilman, että tarkistaisit onko jokin
tiedosto olemassa. Voit joka tapauksessa laittaa tarkistuksen omaan koodiisi jos sitä vaaditaan.
Päätän suosia tätä "kokeneempien koodaajien" linjaa eli ei virheen tarkistusta, koska
kirjasto on pää asiassa tarkoitettu kokeneille koodaajille, jotka hallitsevat mm. muistipalojen käytön.
Hmm no kyllä minäkin taidan vaihtaa mielipidettäni tässä vaiheessa. Funktio voisi vaikka palauttaa arvon 0 (tai jonkin muun virhearvon) tai heittää sen erilaisen errorin, jos tiedostoa ei ole olemassa. Näin ainakin saisi koodaaja heti tiedon, että mikä funktio bugaa. "OpenToRead failed!" ei nimittäin kerro paljoa, että missäs sitä mentiin kuuseen.

EDIT: /me gives a clap to Latexi95

Re: cbSound&Music

Posted: Fri Jun 11, 2010 5:18 pm
by Latexi95
Yleisön pyynnöstä "SM_OpenWav" funktioon on lisätty virheilmoitus.
Toivottavasti nyt kaikki ovat tyytyväisiä. :)
EDIT:

Tein hieman enemmänkin päivitystä, siitä enemmän ensimmäisen viestin "changelog":ssa.