Tervehdys taas.
Nyt kun olen liittynyt niin kysytäänpä eräs taannoinen juttu, joka jäi tekemättä:
Soittoharrastuksen tiimoilta kehkeytyi aikoinaan idea eräänlaisesta mittarista, joka mittaisi musiikin tempoa. Tässä tapauksessa haluaisin 'nähdä' kuinka oma soitto heittelee. No, kuulehan sen korvallakin, mutta noin opettelumielessä olisi kiva tietää täsmälleen. Teinkin aikoinaan mittarin, joka piirtää trendin kuvaruudulle temmon kehittymisestä, mutta tahtia joudutaan painelemaan näppäimistöltä.
Kysyisinkin onko teillä tiedossa konstia mistä voisin tulkita esim. äänikortin ulosantia, josta temmpon voisi selvittää ohjelman avulla?
Onhan se toki mahdollista.
Eli audio inputista luet äänistreamia, sitten esim. FFT-muunnoksella ja siitä saadusta taajuusgraafista luulisin saavan aika kevyellä työllä eroteltua rummunlyönnit. Jos ihan yksittäistä soitinta haet, niin voisi onnistua suoraan äänidatastakin, eli esimerkiksi piano todennäköisesti löytyisi kun hakisi nopeita äänenvoimakkuuden nousuja.
VB6 ei välttämättä ole kivoin mahdollinen kieli tämäntyyppisen tekemiseen.
Lähtökohtana taajuus analyysiin voit käyttää: http://www.relisoft.com/Freeware/index.htm
Tuolla on siis C++ esimerkki ja tutoriaali tarvittavasta teoriasta aiheen ymmärtämiseen.
Jotain tuollaista minullakin on ollut mielessä, onhan VU-mittareitakin musiikin toisto-ohjelmissa jne. (Mistäköhän ne signaalin lukevat, suoraanko tiedostosta purkuvaiheessa vai onko jokin 'takaisinkytkentä' äänikortilta tms?)
Jos kokemusta tai peräti auttavaa esimerkkikoodia löytyy niin tattista vaan!
Muokkaus: Jalski, kiitos linkistä (kirjoitettiin yhtäaikaa..
Musiikin toisto-ohjelmaan on erittäin helppo tehdä VU-mittari, koska toisto-ohjelmalla on jo valmiiksi se musiikki digitaalisessa muodossa, josta se viedään audio outputiin. Ja äänenvoimakkuuden saa tosiaan vallan helposti ihan aaltomuodosta ilman VU-muunnosta. Ottaa vaan itseisarvoista huippuarvon tai keskiarvon ylös siltä osalta näytettä, jota mittari kulloinkin näyttää.
Yksi vaihtoehto olisi, että ajaisit äänidatasi MIDI:nä sisään jollon olisi huomattavasti helpompi selvittää tempo...
Moi jtha!
Mikäli sinulla on VB.NET & NET.Framework SDK asennettuna niin imppaa täältä libZPlay-2.02-SDK.7z & pura paketti.
Luo VB.NET:llä ClassLibrary Projekti (LibZPlayVB6), lisää Projektiin referenssi: System.Drawing, avaa AssemblyInfo.vb ja vaihda ComVisible atribuutti arvoon: True.
Lisää samaiseen tiedostoon Guid attribuutti, luo GuidGen apuohjelmalla oma Guid (Registry format), kopioi ja liitä (poista aaltosulkeet)
<assembly: ComVisible(True)> <assembly: Guid("D9B61BC9-BB46-4CE0-B3D1-972ABDC0B50C")>
Poista Class1.vb tai NewClass.vb projektista, klikkaa Solution Explorerissa hiiren oikealla projektin kuvaketta, valitse->Add->Existing Item->siirry kansioon johon purit imppaamasi paketin, siiry kansioon VB.NET\example ja valitse tiedosto: libZPlay.vb
Tuplaklikka Solution Explorerissa libZPlay.vb kuvaketta ja scrollaa esiin rivi: Public Class ZPlay
ja muuta koodia seuraavasti:
<ClassInterface(ClassInterfaceType.AutoDual)> _ <ComVisible(True)> _ <ProgId("LibZPlayVB6.ZPlay")> _ Public Class ZPlay
Scrollaa sitten esiin rivi: #Region "Constructor and destructor"
ja lisää Bublic Sub New() aliohjelman jälkeen
ennen kaikkia Bublic Function ja Bublic Sub rivejä attribuutti määrite seuraavasti:
<ComVisible(True)> _ Public Function... <ComVisible(True)> _ Public Sub...
Valitse valikkoriviltä Project->Project Options, avaa Signign valilehti, ruksaa: Sign the assembly ja valitse dropdown listalta: <Create>.
Tallenna ja käännä projekti, sulje VB.NET siirry projektin \Bin\Debug kansioon ja kopioi LibZPlayVB6.dll tiedosto ..\Windows\System32 -hakemistoon. Siirry taas kansioon johon purit libZPlay-2.02-SDK kaman ja kopioi libzplay.dll myös ..\System32 -kansioon. Avaa Windowsin komentokehte, siirry \Windows\System32 -kansioon, kirjoita kehotteeseen:
gacutil /i LibZPlayVB6.dll
painele enter nappia ja kirjoita kehotteeseen:
regasm LibZPlayVB6.dll /tlb:LibZPlayVB6.tlb
ja painele taas enter nappia.
Nyt saat kirjaston käyttöösi VB6:ssä ja tuotua luokan projektiin lisäämällä referenssin: LibZPlayVB6.tlb
Kaipaamasi funktio on: GetTempo
Kunhan tutustut lähemmin ohjeisiin (libzplay.chm) niin huomaat, että kirjasto ei ole mitään aivan pilipalikamaa...
neau33 kirjoitti:
Kaipaamasi funktio on: GetTempo
Jotenkin epäilen että kysyjää ei hirveästi lohduta saada aina 100, soitti miten tahansa.
Ohhoh! Kiitoksia ohjeista, Nea.
Täytyypä kokeilla kun ns. "oikeat työt" hellittävät.
Käytössäni on vain VB6 professional, mutta koetan pärjätä sillä jotenkin...
OFF TOPIC:
Yhden projektin olen tehnyt 2005 Visual studiolla(VB) ja sovellus oli .net-pohjainen. Silloin esiintyi ongelmia, joihin en voinut vaikuttaa, kuten VB6:sta poiketen koodin alkuosassa oli automaattisesti luotuja rivejä, joissa muistaakseni määriteltiin ohjelman käyttämiä komponentteja tms. Näille riveille tuli automaattisesti myöskin bugeja, jotka piti korjata poistamalla osa tekstistä. Muistaakseni myös vasempaan laitaan lisääntyi hallitsemattomasti kuvakkeita(monistui samoja moneen kertaan) aina kun ohjelma avattiin, niitä piti poistaa ajoittain. Projekti oli Data Translationin USB-pohjainen näytteenottokortti, jonka .net esimerkkiohjelmat tulivat kortin mukana.
Jokohan studio toimii luotettavasti? Olisikohan esimerkkiohjelmissa ollutkin jotakin, vikaa eikä studiossa? Onko vastaavia kokemuksia?
Heippa taas!
Mitenkähän olisi jos syöttelis väliin vaikkapa metronomin tikitystä (current tempo) ja vertailis..?
Aihe on jo aika vanha, joten et voi enää vastata siihen.