• Advertisement
  • entries
    438
  • comments
    1183
  • views
    767208

Sweet.

Sign in to follow this  

149 views

Heh. This is cool as hell. I've (sorta) finished all of the unit generators Burk provides on the CD-ROM that game with GG3. I've tidied them up a bit, turned them into chainable modules, and exported them to Lua. I say sorta, because I haven't thoroughly tested them, and there are apparently some bugs somewhere.

I have gotten the Wind, Rocket Engine, and Sonar Ping circuits to work using the chaining structure, but I'm stumbling on the Helicopter one. It mostly works, component-wise, but I think I have a problem with the InterpolatingDelay module, since that is where it seems to break. I'll have to fuxxor with it some more, see if I can find what the problem is.

But other than that, this thing is cool as hell. I can simply create chains of modules that combine various signal generators, filters, and other operations, then call the module at the end of the chain to fill an SDL_mixer chunk with a sample of a given length, then play the resulting sound effect, all from a Lua prompt. Observe:


-- Generate a series of sonar pings

rate=CConstantModule(0.4)
pulsecon=CConstantModule(7.0)
moddepth=CConstantModule(80.0)
modrate=CConstantModule(180.0)
freq=CConstantModule(700.0)
Q=CConstantModule(1000.0)
amp=CConstantModule(1.0)

pulse=CImpulseOscillatorModule()
rn=CRedNoiseModule()
filter=CLowpassFilterModule()

mult=CMultiplierModule()
adder=CAdderModule()

pulse:setSource(pulsecon,0)
pulse:setSource(rate,1)

rn:setSource(moddepth,0)
rn:setSource(modrate,1)

filter:setSource(pulse,0)
filter:setSource(adder,2)
filter:setSource(Q,3)

mult:setSource(filter,0)
mult:setSource(amp,1)

adder:setSource(rn,0)
adder:setSource(freq,1)

snd=CSoundEffectCreate()
snd:loadSoundUnit(mult, 200000)
snd:play(0,0)


That Lua code when executed by the application sets up the module chain to generate a series of sonar pings, and dumps 200,000 samples worth of sound data (currently at the default SDL_mixer sample rate of 22050, so a couple of seconds) into a sound effect which can then be sent to SDL_mixer to play.

The binding works similarly to how libnoise works. Each module can have a certain number of input sources, themselves also modules, that are read when a module's getValue() is called. For example, a SineOscillator module has two sources, for Amplitude and Frequency. Using CConstant modules for each produces a steady note at a steady volume; interjecting a little red or white noise in there for frequency causes the pitch to vary. And so forth. A low-pass filter has 3 sources--signal source, frequency, and Q. Sources are set using the generic setSource() function, with reasonable defaults if a required source hasn't been set. (Should probably raise an exception, but what the hell).

So the above sonar ping (pretty much a direct refactoring of the sample given in the book) combines a red noise generator, impulse oscillator, and a low-pass filter with some combiner trickery, and results in a fairly elementary (yet reasonable) imitation of a sonar ping. Pretty fun stuff. Now to figure out the module chain for ass-kicking, bass-rumbling explosions. [grin]
Sign in to follow this  


0 Comments


Recommended Comments

There are no comments to display.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Advertisement