cbSound&Music

Jaa meneillään olevat projektisi tai valmiit pelit muun yhteisön kanssa täällä.
Post Reply
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

cbSound&Music

Post 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.

Attachments
cbSound&Music.zip
(2.22 KiB) Downloaded 277 times
Last edited by Latexi95 on Fri Jun 11, 2010 9:12 pm, edited 2 times in total.
Herra HoOpO
Newcomer
Posts: 36
Joined: Fri Mar 20, 2009 3:29 pm

Re: cbSound&Music

Post 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? :?:
(\__/)
(='.'=)
(")_(")
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: cbSound&Music

Post 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. :)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbSound&Music

Post 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. ;)
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: cbSound&Music

Post 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
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbSound&Music

Post 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.
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: cbSound&Music

Post 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.
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: cbSound&Music

Post 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.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbSound&Music

Post 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
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: cbSound&Music

Post 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ä.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: cbSound&Music

Post 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ä.

Last edited by MaGetzUb on Fri Jun 11, 2010 3:02 am, edited 1 time in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: cbSound&Music

Post by esa94 »

MaGetzUb wrote:
EDIT:

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

aiotaan*
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbSound&Music

Post 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.
Someday coder
Active Member
Posts: 106
Joined: Wed Jul 30, 2008 5:04 pm

Re: cbSound&Music

Post 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.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbSound&Music

Post 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.
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: cbSound&Music

Post 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
Last edited by valscion on Fri Jun 11, 2010 6:50 pm, edited 1 time in total.
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbSound&Music

Post 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.

Post Reply