9
Hangszerkesztő program írása
  • olivaoil
    #9
    ÚrIsten-Mennyország, hát az eddigi kísérleteim pont erre vezetnének rá !!! :

    Egész egyszerűen képzeletben a bájt értékeit 0 és 255 helyett -127 és +127 közé kell vennem, és utána szimplán az azonos helyzetű bájtokat, mint mintavételi pontokat össze kéne adnom, majd utána kivonnom mindegyiknél a kapott bájtértékből 127-et.
    Túlmintavételezés ellen pedig gondolom a fentit egyszer levezetem, de akkor nem írom ki az értékeket bájtként, csak megnézem, hogy melyik érték a legeslegnagyobb a sok millió közül, megnézem, hogy az hányszor van meg 256-ban, majd annak veszem a felét, és mind a két forráshangfájl mintavételi értékeit (amiket -127 és +127 közé esőnek tekintek (tehát bájt-127) ismét) osztom ezzel a számmal, majd a halkított hangfájlok mintapontjait adogatom össze.

    Jól mondom?

    Most gyorsan meg is néztem Audacity-ben, hogy összeadtam egy mono sávot natúr 4 sec.-os 55 Hz-s szinuszhullámmal, meg egy ugyanilyet 880 Hz-s szinuszhullámmal és látszólag tökre ez történt. (!)

    Király!
  • tobias88
    #8
    c++ on alapuló Qtval egyszerű
  • olivaoil
    #7
    Köszönöm szépen!

    Az alapoktól nem valószínű, hogy meg tudnám írni, mivel épp hogy az "összeadást" nem tudnám hullámtanilag/matematikailag levezetni, úgyhogy majd végignézem a linkeket.

    Még egyszer köszönöm.
  • Dj Faustus #6
    A Codeproject oldalán található egy pár C#-os/C++-os WAV-állomány kezelésére szolgáló példa:
    C# WAV file class, audio mixing, and some light audio manipulation
    WAVE File Processor in C#
    CWave - A Simple C++ Class to Manipulate WAV Files

    Ha az alapoktól akarod megírni:
    - A WAV állomány első 44 bájtja tartalmazza a fejlécet, amiben benne van a mintavételezés, a bitmélység, és a csatornák száma. Reméljük, hogy a két összeadandó állomány azonos paraméterekkel rendelkezik.
    - Ezeket az állományokat beolvasod egy-egy (dinamikus) tömbbe - az állományok bitmélysége határozza meg a tömb elemének típusát.
    - Hogy a végleges állománynál ne legyen túlvezérlés, meg kell nézni a két tömb összegének maximumát. Ha a két tömb összegének maximuma nagyobb mint a bitmélység által adott tartomány, akkor mind a két hang hangerejét egyenlő mértékben le kell csökkenteni.
  • olivaoil
    #5
    "Mit csinálna az említett segédprogram hogy külön programot írsz rá?"
    - Azt inkább majd akkor teszem publikussá, amikor majd magát a programot is felteszem. Igazából egyszerű dolgokról lenne benne szó, így majd előfordulhat, hogy már van ilyen, de hát azért reménykedem, hogy én leszek az első.

    "Miért nem használsz erre a célra már meglevő hangszerkesztő programot - például Audacity vagy WavoSaur?"
    - Mint már mondtam, összefüggésben lenne a feladat más programrészletek munkájával, a felhasználó pedig nem nagyon örülne neki, hogyha külön kéne telepíteni az audacity-t azért az egy feladatért s a távvezérlés talán még macerásabb is lenne.

    "Programozási nyelv? Operációs rendszer? Elegendő parancssoros program vagy grafikus felület is kell?"
    - Programozási nyelvnek a legjobban C#-nak örülnék, mivel abban kezdtem el a többit, de nem hiszem hogy ott kivitelezni lehet ezt a feladatot, vagy csak macerásan (hogyha meg lehet oldani ezt bájtérték-számolásokkal, akkor talán C#-ban is lehet).
    - Jó lenne, ha Win32-ben tudnám folytatni, mivel csak az van. (A Linux videodrivere egyszer kisütötte a videókártyámat, úgyhogy azt nem szeretem)
    - A konzolos simán szóba jöhet, amit eddig csináltam az úgyis az...

    "Valós időben szeretnéd a két jel összeadását (például két bemenő jelet a vonalkimenetre küldeni), vagy két hangállományról (ez esetben elegendő szimpla WAV, vagy használsz valamilyen tömörítést is) van szó? Ugyanaz a bitmélység, mintavételezési ráta?"
    - Nem, nem valós időben, azt maximum majd megcsinálják mások, hogyha tetszene nekik a dolog (szerintem jól lehetne az elgondolásomat pl. rádiósugárzás titkosítására használni, de ebbe most ne menjünk bele).
    Itt szimpla WAV-okról van szó, teljesen tömörítéstől mentes WAV-okról. Gondolom könnyebb lenne az, ha a bittmélység és a mintavételezési ráta ugyanaz lenne, erre úgyis van jól bevált standard (44100 ; 16), úgyhogy ez már a felhasználó toleranciája.

    Tehát mondjuk van két db sztereó sávos hanganyag, és ezeket bármiféle tartalom/bitráta/lejátszási paraméterek módosítása nélkül egyetlen sztereó sávra veszem és azt a merevlemezre írom. Ugyanez két külön, mono sávos hangmintánál egyetlen mono sávot eredményezne.
    Így persze a két eredeti hangminta a végeredményben szétválaszthatatlan, de ez nem jelent gondot, én direkt egyetlen kimenő sávot (sztereó/monó) akarnék.
  • Dj Faustus #4
    Pár kérdés bennem is felmerült:
    - Mit csinálna az említett segédprogram hogy külön programot írsz rá?
    - Miért nem használsz erre a célra már meglevő hangszerkesztő programot - például Audacity vagy WavoSaur?
    - Programozási nyelv? Operációs rendszer? Elegendő parancssoros program vagy grafikus felület is kell?
    - Valós időben szeretnéd a két jel összeadását (például két bemenő jelet a vonalkimenetre küldeni), vagy két hangállományról (ez esetben elegendő szimpla WAV, vagy használsz valamilyen tömörítést is) van szó? Ugyanaz a bitmélység, mintavételezési ráta?
  • Molnibalage
    #3
    Mit értesz összemixelés alatt? Az, hogy a két hangsávot egymásra teszed? Bármelyik basic zene vagy videószerkesztő tudja.
  • gergely1991
    #2
    Van egy program LMMS (Linux multimedia Studio) annak van forráskódja, letöltöd, kielemzed és örülsz.Legközelebb mondjuk ide írj minek egy új topikot nyitni.Ha esetleg felakarod használni a forráskódot(és publikussá teszed a projekted) akkor a GNU liszensz alapján teheted.
  • olivaoil
    #1
    Helló, nem tudna valaki (programozásban jártas) esetleg valami leírást adni arra, hogy hogyan lehetne nekilátni egy olyan program írásának, ami két hangsávot tudna összemixelni. Tehát hogy mondjuk két sztereósávos zenét tesz egyetlen sztereó sávba a két hanganyag tartalmi módosítása nélkül.
    Hangszerkesztő programok írására rákerestem a Google-on, de ott csak már kész hangszerkesztő programok jönnek be.
    Azért lenne egy ilyen kódra szükségem, mert csinálnék egy segédprogramot magamnak s szükségem lenne egy ilyen részre belőle.

    Megköszönném ha segítenétek! Esetleg utána cserébe megosztom azt amivel készülök