aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/sound_adlib.cpp
AgeCommit message (Collapse)Author
2006-03-21Implemented "sound triggers" so that the music does not stop shortly afterTorbjörn Andersson
entering the castle. I hope this is a fair approximation of how the original worked. Of course, this led to a couple of more renamings: _unk5 -> _soundTrigger updateCallback54() -> update_setSoundTrigger() snd_setUnk5() -> snd_getSoundTrigger() (yes, "get") At the moment, the only known sound triggers are the ones in the castle. If an unknown trigger is set, the debugging messages will be really, really noisy. I don't know if I should consider this a bug or an extremely annoying feature. svn-id: r21396
2006-03-17Oops, I never meant to remove *that* line! Put it back again. (This fixes theTorbjörn Andersson
flute sound, and probably other regressions as well.) svn-id: r21345
2006-03-17The opcode functions are not allowed to modify their own channel.dataptrTorbjörn Andersson
directly. If they want a new data pointer, they have to use the dataptr parameter. This fixes a subtle bug that would cause the wrong music to play when getting the quill in Kyra 1. svn-id: r21344
2006-03-16More cleanups and renamings: _sfxSecondByteOfSong -> _sfxPriorityTorbjörn Andersson
Added some comments on the strange but probably harmless things going on in playSoundEffect() svn-id: r21340
2006-03-16Went through callbacks 51, 52 and 53, comparing them to LordHoto's annotatedTorbjörn Andersson
disassembly. I think they're correct now, and a bit easier to read. My old comments were wrong, too. I think they are for manipulating the Adlib rhythm section volumes. I'm not sure the Kyra music ever uses the Adlib rhythm section. svn-id: r21339
2006-03-16We have several functions where we need to find the pointer to a program or anTorbjörn Andersson
instrument. These are found using the lookup tables in _soundData on offsets 0 and 500 respectively. Added helper functions for that, which makes the code a lot tidier. Particularly in update_setupRhythmSection(), where it's now much clearer where it's getting all those "unk" values from. Use the checkValue() function (which limits the "total level" to its valid range) for the calculateOpLevel1() and 2() functions as well. Renamed updateCallback16() to update_waitForEndOfProgram(). svn-id: r21337
2006-03-16More renamings:Torbjörn Andersson
callbackOutput() -> setupPrograms() callbackProcess() -> executePrograms() updateCallback3() -> update_setupProgram() _unk4 -> _rhythmSection updateCallback48() -> update_setupRhythmSection() updateCallback49() -> update_playRhythmSection() updateCallback50() -> update_removeRhythmSection() svn-id: r21336
2006-03-16I don't know if it's our bug, or a bug in the original Kyra music driver, butTorbjörn Andersson
updateCallback3() would call unkOutput2(9) in at least one case. This is obviously wrong because it a) reads outside _regOffsets[], and b) writes to invalid Adlib registers. Now unkOutput2() has the same safeguards as noteOff() already had, making callbackOutput() and updateCallback3() even more similar. svn-id: r21335
2006-03-16Fixed some comments and made a couple of cleanups to make it a bit more clearTorbjörn Andersson
just how similar callbackOutput() and updateCallback3() are. svn-id: r21333
2006-03-14Cleanup.Torbjörn Andersson
svn-id: r21304
2006-03-14Added workaround in FMOPL for the pathological case where a note was turned offTorbjörn Andersson
while still at the very beginning of the "attack" phase. This is the very lowest point on the attack curve, yet it would continue from the beginning of the release curve, i.e. its very highest point. This is what caused Kyra to often play low-frequency notes at the very beginning of a new song. (That, and a truly bizarre function for initialising the channels.) The proper fix would be to locate the correct point on the release curve and continue from there. For now, though, only handle the trivial case. svn-id: r21302
2006-03-14Fix typo in comment.Torbjörn Andersson
svn-id: r21298
2006-03-14- Fixes a bug in update_primaryEffect (wrong sound from the birds outside ↵Johannes Schickel
brandons home is fixed with this) - Changes _tempo, tempo, position, unk41, unk32, unk18, unk19, _unkValue3 to unsigned (should be correct this time) svn-id: r21293
2006-03-14Fixes _unkTables, I made a mistake while extracting those last time it seems.Johannes Schickel
svn-id: r21287
2006-03-14Updated comment with more circumstantial evidence that the low-frequency noteTorbjörn Andersson
bug is a bug in our fmopl.cpp. Ken Silverman's Adlib emulator doesn't seem to exhibit the bug either. (But is apparently less feature complete than MAME's.) svn-id: r21275
2006-03-13Further clarifications to the comment about the "low-frequency notes atTorbjörn Andersson
beginning of music" bugs. As an experiment, I tried hooking up ScummVM with the most recent version of the FMOPL code, and the bug went away. Unfortunately, I believe we are stuck with the ancient version for license (and performance?) reasons. svn-id: r21267
2006-03-13Cleaned up the comments in unkOutput2(), and added a big note about the bugTorbjörn Andersson
where low-frequent noises are playing at the beginning of some new sounds. svn-id: r21265
2006-03-13Changed type for samplesleft in order for MIN macro to work properly on all ↵Lars Persson
platforms svn-id: r21264
2006-03-13Things continue to fall into place. In other words, more renamings:Torbjörn Andersson
unk3 -> spacing1 unk7 -> spacing2 unk12 -> fractionalSpacing updateCallback4() -> update_setNoteSpacing() updateCallback9() -> update_stopChannel() updateCallback15() -> update_stopOtherChannel() updateCallback17() -> update_setupInstrument() updateCallback28() -> update_setFractionalNoteSpacing() updateCallback43() -> update_nop1() updateCallback47() -> update_nop2() svn-id: r21261
2006-03-13I was going to hold off on this until the "Pool of Sorrow" music had been fixedTorbjörn Andersson
but it seems that it drifts out of sync after a few repeats even with the original interpreter. It's a feature! This cleanup clears up some of the more confusing break/continues in the callbackProcess() function, and gets rid of _continueFlag. svn-id: r21259
2006-03-12Until now, we have confusingly used the terms "state" or "table" where weTorbjörn Andersson
really mean "channel". Fixed that: OutputState -> Channel _curTable -> _curChannel _outputTables[] -> _channels[] The biggest change was modifying all the "state" and "table" local variables and function parameters. Ahd, at no extra charge: _outputTable[] -> _regOffset[] svn-id: r21247
2006-03-12Renamed callback1 to primaryEffect and callback2 to secondaryEffect.Torbjörn Andersson
svn-id: r21246
2006-03-12Cleaned up comment and did some more renaming:Torbjörn Andersson
unk4 -> position (measured on a very short ruler :-) unk5 -> duration svn-id: r21245
2006-03-12- Renames some functions:Johannes Schickel
updateCallback31 -> update_setChannelTempo updateCallback42 -> update_resetToGlobalTempo updateCallback55 -> update_setTempoReset - Renames some vars: unk1 -> tempo unk6 -> tempoReset - Fixes tempo bugs svn-id: r21244
2006-03-12- Changes usage of regBx to regAx in primaryEffect2 (seems to be a bug ↵Johannes Schickel
introduced when renaming). - Changes unk41 and unk32 to signed. - Fixes wrong sound when dropping items (that was also a little bug in primaryEffect2) svn-id: r21240
2006-03-12Compensate for rounding errors in _samplesPerCallback by having readBuffer()Torbjörn Andersson
generate "leap samples". I doubt this will make any noticeable difference, but at least now we can probably rule out timer inaccuracies from the list of possible suspects for the remaining bugs. Also removed unnecessary mutex locking/unlocking from readBuffer(), spotted by LordHoto. svn-id: r21239
2006-03-12Corrects former commit which deleted sound file loading after the scene with ↵Johannes Schickel
malcolm and kallak. Also corrects callback50() which seem to improve the sound a bit in the kallak writing scene. svn-id: r21238
2006-03-12After several days, telling LordHoto over and over that "no, I don't think theTorbjörn Andersson
timer inaccuracies can cause that kind of problems, or we'd have noticed it in the other game engines as well", guess what? The other game engines do not necessary use a timer for their Adlib music. So now Kyra doesn't either. Fortunately for my dignity, the music is still a bit uneven at times, but the situation does seem to have improved a bit, and the sound effects sound better to me now. svn-id: r21237
2006-03-12Music in the last two intro scenes plays now again with adlib.Johannes Schickel
Cleaned up the sound code a bit (removed some unneeded functions). svn-id: r21234
2006-03-12Added debug message for the standard "note on" opcodes as well.Torbjörn Andersson
svn-id: r21233
2006-03-12And now, for a change, some more renamings:Torbjörn Andersson
update1() -> setupDuration() updateAndOutput1() -> setupNote() setInstrument() -> setupInstrument() (just for the symmetry) updateAndOutput3() -> noteOn() That made the following two renamings seem natural: updateCallback10() -> update_playRest() updateCallback27() -> update_playNote() I decided to number the secondary effects, even though there's only one: update_setupSecondaryEffect() -> update_setupSecondaryEffect1() update_removeSecondaryEffect() -> update_removeSecondaryEffect1() And finally, I renamed the effects callbacks: stateCallback1_1() -> primaryEffect1() stateCallback1_2() -> primaryEffect2() stateCallback2_1() -> secondaryEffect1() svn-id: r21232
2006-03-12Added a block of comments about command parsing and timing. Perhaps it will beTorbjörn Andersson
of use in tracking down the tempo bugs. svn-id: r21230
2006-03-11Some more renaming:Torbjörn Andersson
updateCallback18() -> update_setupPrimaryEffect1() updateCallback19() -> update_removePrimaryEffect1() updateCallback21() -> update_setupPrimaryEffect2() updateCallback40() -> update_removePrimaryEffect2() updateCallback14() -> update_setupSecondaryEffect() updateCallback30() -> update_removeSecondaryEffect() updateCallback37() -> update_changeExtraLevel1() updateCallback34() -> update_changeExtraLevel2() svn-id: r21217
2006-03-10More comments, and some very minor cleanup.Torbjörn Andersson
svn-id: r21208
2006-03-10Added comment detailing what I believe I know about the remaining "unk"Torbjörn Andersson
variables in OutputState. svn-id: r21207
2006-03-10Further guesswork: 'unk2' appears to be the priority of a sound, since theTorbjörn Andersson
callbackOutput() and updateCallback3() functions won't change the channel data pointer unless the new sound has a higher unk2 and the current one. Since it's set to 0 when the data pointer is nulled, I've changed the priority to be unsigned. The updateCallback22() function is now update_setPriority(). svn-id: r21206
2006-03-10Fleshed out some guesswork comments.Torbjörn Andersson
svn-id: r21205
2006-03-10Renamed _unkOutputByte1 _curRegOffset. It doesn't always correspond to theTorbjörn Andersson
_curTable channel, but it probably does so whenever both of them are used together. svn-id: r21204
2006-03-10Added guesswork comments for stateCallback2_1() and its related functions andTorbjörn Andersson
variables, and cleaned it up slightly. (Some of its variables are now signed.) svn-id: r21203
2006-03-10Added guesswork comments for stateCallback1_1() and its related functions andTorbjörn Andersson
variables. svn-id: r21202
2006-03-10Fixed some obvious errors in the comments I added before.Torbjörn Andersson
svn-id: r21201
2006-03-10Added some guesswork comments about stateCallback1_2() and related functionsTorbjörn Andersson
and variables. svn-id: r21200
2006-03-10The calculateLowByte1() and 2() functions are used for calculating the "totalTorbjörn Andersson
level", which I believe is the individual channel volume. (The functions also return the "scaling level" bits, but they are preserved, not calculated.) I have renamed these functions calculateOpLevel1() and 2(). The unk25 and unk26 variables have been renamed opLevel1 and opLevel2. These are called oplvl_1 and oplvl_2 in our MidiDriver_ADLIB class. The unk26, unk27 and unk28 variables are potentially added to both operator levels, and have been renamed opExtraLevel1, opExtralevel2 and opExtraLevel3. The updateCallback25() function has been remamed update_setExtraLevel1(). The updateCallback33() function has been renamed update_setExtraLevel2(). The updateCallback32() function has been renamed update_setExtraLevel3(). Note that these callbacks aren't quite as similar as their names would seem to indicate: They differ in whether or not the volume is updated and/or how the parameters are passed. svn-id: r21199
2006-03-10Renamed "algorithm" "twoChan" to be more consistent with our MidiDriver_ADLIBTorbjörn Andersson
class, where the corresponding variable is called _twochan. svn-id: r21198
2006-03-10Since updateAndOutput2() is the only function that sets up wave forms andTorbjörn Andersson
stuff, it pretty much has to be our "set instrument" function. Also, while I'm not entirely sure of the implications, "unk23" is the Algorithm bit for the Feedback / Algorithm register, so I've renamed it "algorithm". svn-id: r21197
2006-03-10Some more/updated comments.Torbjörn Andersson
svn-id: r21196
2006-03-09- Removes deleted waitTicks prototype in KyraEngineJohannes Schickel
- Adds sound fading support to the adlib player - Adds support for stopping running tracks - Changes baseFreq type back to uint8 - corrects octave handling in updateAndOutput1 (Thanks to eriktorbjorn for doing that) svn-id: r21185
2006-03-09As LordHoto pointed out to me, updateCallback41() was slightly different afterTorbjörn Andersson
all: it adjusts the frequency even when state.unk16 is zero. Fixed that, and added some comments to hopefully explain the differences between the cleaned up code and the original disassembly. svn-id: r21184
2006-03-09More cleanups and renamings:Torbjörn Andersson
* Rewrote updateCallback41() in terms of updateAndOutput1(), since they were almost identical to begin with. * Rewrote updateAndOutput1() for better readability. * Made unk10 signed, and renamed it baseOctave. * Made unk14 signed, and renamed it baseNote. * Made unk15 signed, and renamed it baseFreq. * Renamed unk17 regAx. It appears to be a cache for that register. * Renamed unkOutputValue1 regBx. It appears to be a cache for that register. * Renamed updateCallback8() update_setBaseOctave(). * Renamed updateCallback13() update_setBaseNote(). * Renamed updateCallback20() update_setBaseFreq(). Which still leaves the mystery of unk16 and _unkTables[]. Perhaps *this* is the pitch bend? svn-id: r21183
2006-03-09Set down in comments what I know about _outputTable[], and what I suspect aboutTorbjörn Andersson
_unkTable[]. Investigating the latter further might help unravelling several of the "unk" variables. (Right now, I'm suspecting that unk15 is the pitch bend.) svn-id: r21164