Toon posts:

[alg] sound editing

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik bezig met het maken van een kleine "sequencer" in de vorm van een tracker (madtracker, fasttracker). het is te zeggen: op het zelfde principe:

Nu kan ik één kanaal al afspelen (input: één vector van de sound,een vector met nootnummer en een vector met hoe lang dat moet worden afgespeeld).

Het probleem is als ik het volgende doe bij meerdere kanalen
code:
1
outputSound(i) = outputsound(i) + nieuweSound(elementY)

nu zit ik met een klein probleemje: geluiden "combineren" (bvb een drumbass samen met een clap) kan je dus blijkbaar niet door die twee waarden op te tellen.... ofwel?
doe ik iets mis?

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je zegt [alg] maar je hebt wel al een lap code in gebruik. Laat anders toch wat meer zien.

En algemene interpretatie zou zijn dat je inderdaad de kanalen bij elkaar op moet tellen op elk moment.

{signature}


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je moet gewoon de samples bij elkaar mixen mbv een optelling, simple as that :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15:26

Janoz

Moderator Devschuur®

!litemod

Een geluid is meestal een 16 bits getal. Als je 2 16 bits getallen bij elkaar op gaat tellen zul je buiten het bereik komen. Om te mixen zul je niet op moeten tellen maar het gemiddelde nemen. Anders krijg je inderdaad een groot kraak festijn. Gewoon beide samples delen door 2 en dan optellen will do the trick. Let wel op dat je bij het optellen van 3 signalen door drie moet delen en niet 2x door twee. In het laatste geval zal het laatst toegevoegde signaal dan veel te sterk zijn.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Voutloos schreef op 01 december 2003 @ 23:25:
Je zegt [alg] maar je hebt wel al een lap code in gebruik. Laat anders toch wat meer zien.

En algemene interpretatie zou zijn dat je inderdaad de kanalen bij elkaar op moet tellen op elk moment.
de algemene structuur is:
kheb een sound matrix: per row een vector van de sounds (één channel kan max één sound hebben)
kheb een input matrix: per row een vector met per "tick" een nootnummer
ook nog een lengte matrix: per row en dan per tick hoelang de noot mag spelen

lussenstrucuur:

code:
1
2
3
4
5
6
7
8
9
10
//lus per tick

    // lus per channel

          // lus per lengte

                 //lust per byte van de sound
                           R(1,positie) = R(sound(1,l); //l is counter van sound >> geeft als result eerste sound uit mijn matrix
                           R(1,positie) = sound(2,l); // werkt ook: tweede sound gaat nu afgaan
                           R(1,positie) = sound(1,l) + sound(2,l); >> dit werkt NIET. hij laat alleen maar mjin clap horen, tweede sound, terwijl hij ze zou moeten optellen en beide laten horen

dus ik heb drie gevallen uitgetest en de resultaten staan erbij! (niet tegelijk natuurlijk, want dan fliptem hé :d)

Verwijderd

Ik ben een tijdje geleden ook bezig geweest aan een tracker (met 16 "sporen") en heb gewoon de mogelijkheden van de sound engine die ik gebruikte (Fmod) gebruikt om "tegelijkertijd" meerdere samples door elkaar te laten spelen. Mbv. de build-in mixer-opties en een buffer werkte dat vrij aardig.

Ik ben ook redelijk ver gekomen met dat progje, maar kreeg het niet voor elkaar ervoor te zorgen dat alle pattern-entries ook exact op het goede moment uitgevoerd werden (dwz. hij was soms 20 of 30 milliseconden te vroeg of te laat), waardoor het geheel nogal onbruikbaar was.

Moraal: Gebruik je een of andere sound-engine of maak je van de windows api gebruik voor het afspelen van de geluiden?

Verwijderd

Topicstarter
het is puur voor educatief gebruik ;-)
gebruik makend van een wiskunde pakket en niet realtime.
er komt al iets uit dat tesamen klinkt maar de diepe bas is weggevallen :s

  • abeker
  • Registratie: Mei 2002
  • Laatst online: 23-05 21:23

abeker

...

Ik zou het resultaat niet delen door het aantal kanalen, dat is nogal slecht voor het volume namelijk. Stel je voor dat je 16 kanalen aan het afspelen bent, dan is het maximum volume van een sample nog maar 1/16 van het originele volume van die sample.

Gewoon samples optellen (in een int bijvoorbeeld), en daarna gaan clippen (dus limiteren op -32768-32767) zodat de waardes nooit buiten het bereik kunnen komen. Ga het resultaat alleen delen als het echt niet anders kan.

the less one forgets, the less one remembers


Verwijderd

Topicstarter
abeker schreef op 01 december 2003 @ 23:51:

Gewoon samples optellen (in een int bijvoorbeeld), en daarna gaan clippen (dus limiteren op -32768-32767) zodat de waardes nooit buiten het bereik kunnen komen. Ga het resultaat alleen delen als het echt niet anders kan.
gaat er op deze manier niet veel informatie verloren?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Janoz schreef op 01 december 2003 @ 23:33:
Een geluid is meestal een 16 bits getal. Als je 2 16 bits getallen bij elkaar op gaat tellen zul je buiten het bereik komen. Om te mixen zul je niet op moeten tellen maar het gemiddelde nemen. Anders krijg je inderdaad een groot kraak festijn. Gewoon beide samples delen door 2 en dan optellen will do the trick. Let wel op dat je bij het optellen van 3 signalen door drie moet delen en niet 2x door twee. In het laatste geval zal het laatst toegevoegde signaal dan veel te sterk zijn.
2 geluiden bij elkaar samenvoegen is simpelweg optellen. Als je het gemiddelde neemt dan worden beide geluiden half zo hard. Bij genormalizeerde samples moet je idd de amplitude wat imperken, maar bij genormalizeerde samples is het geluid ook op z'n hardst.

Een algemene divider gebruiken werkt wel, maar die moet wel constant zijn. Het moet iig niet zo zijn dat als er maar 1 van de 4 kanalen afspeelt dat je dan niet door 4 hoeft te delen oid.

Overigens is het wel verstandig om tijdens het optellen het resultaat te controleren en dan clampen waar nodig

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1