Author Topic: The "Hold" feature  (Read 626 times)

0 Members and 1 Guest are viewing this topic.

Offline Kawa

The "Hold" feature
« on: December 03, 2020, 10:28:00 AM »
By now we're all acquainted with how loop points work in SCI sound resources, but there's one other feature that I think deserves a closer looking at, being held.

According to the original scripts...
Quote
This method only applies to sounds that were set up to be
held by the musician. Holding a sound that was not meant to
be held will simply act as an infinite loop on the sound.
Musicians can set a hold point in the song, where the programmer
may hold at if needed (for syncing with slow machines). When
held the sound will infinitely loop on the same segment set up
by the musician until it is released by the programmer. The
'where' argument specifies which hold point to loop at, since
there can be multiple points in one song. holding at a second
or third point will automatically release the previous one.

Two examples from Leisure Suit Larry 1 are the blender in the "messed up again" scene (sound 190, provided for the readers' sake), and "dancing with Fawn" (611). The blender scene script holds at 10, as informed by the sound makefile, and the dancing cutscene holds at 10 and 20.

Looking at the blender noise in SCI Companion, I spy with my little eye a "control 82: 10" in the event list for track 16, and both 10 and 20 in the dance music. Now, isn't that interesting?



Offline Kawa

Re: The "Hold" feature
« Reply #1 on: December 04, 2020, 01:21:56 PM »
A quick study of the dance music shows the following:

It starts with Mozart's 5th Symphony, the da-da-da-duuum part, followed by a single beat of drums, a fill beat, the second da-da-da-dum, another drum beat, another fill, then the rest of the song as usual. What's unusual about this song is that it has two different loop points. You can only see an indicator for the first in SCI Companion, but "ProgChange ch:15 $7f (127)" appears twice in the sidebar with the control track selected, with "Control 82: 10" and "Control 82: 20" as the very next event.

Turns out, the single beat of drums has a loop point at the start and a hold point at the end, right before the fill beat. Both of them do. And that's why, if you play this song in SCI Companion or SV, it'll mistakenly loop "oddly". That song isn't meant to be looped, it's meant to hold.

(Edit: also, matching cue points just before the loop points, but I think those are purely for the cutscene's sake.)

And that's how Mafia holds work.
« Last Edit: December 04, 2020, 01:54:39 PM by Kawa »

Offline MusicallyInspired

Re: The "Hold" feature
« Reply #2 on: December 05, 2020, 02:08:42 PM »
Wow never knew about that controller!
Brass Lantern Prop Competition

Offline Kawa

Re: The "Hold" feature
« Reply #3 on: December 05, 2020, 05:47:49 PM »
It's used more often than you'd think:

Code: [Select]
Castle of Doctor Brain, Component.sc(258): hold: 1
Conquests of the Longbow, fMonk.sc(625): (gSFX number: 15 loop: -1 play: hold: 1)
Conquests of the Longbow, jment.sc(83): hold: 1
Conquests of the Longbow, jwitchct.sc(430): (gRgnMusic2 number: 506 loop: 1 play: hold: 1)
Conquests of the Longbow, ZScript.sc(413): hold: 10
EcoQuest 1 CD, RM600.sc(105): (gLongSong number: 665 loop: -1 play: hold: 10)
EcoQuest 2, ceremony.sc(498): (gGameSound1 number: 427 play: hold: 1)
EcoQuest 2, ceremony.sc(535): (gGameSound1 hold: 2)
EcoQuest 2, ceremony.sc(546): (gGameSound1 hold: 3)
EcoQuest 2, ceremony.sc(557): (gGameSound1 hold: 4)
EcoQuest 2, ceremony.sc(797): (gGameSound1 number: 434 loop: 1 client: 0 play: hold: 1)
EcoQuest 2, rm640.sc(359): (gGameSound1 hold: 2)
EcoQuest 2, rm640.sc(369): (gGameSound1 hold: 3)
EcoQuest 2, rm640.sc(379): (gGameSound1 hold: 4)
EcoQuest 2, rm640.sc(412): (gGameSound1 number: 636 play: hold: 1)
EcoQuest 2, rm880.sc(557): (gGameSound1 number: 882 loop: -1 play: hold: 1)
EcoQuest 2, rm880.sc(774): (gGameSound1 number: 886 loop: -1 play: hold: 1)
King's Quest 6, rm210.sc(1276): (if (proc913_0 10) (gGlobalSound4 hold: 10))
King's Quest 6, rm580.sc(152): hold: 10 ; twice in this script.
King's Quest 6, rm580.sc(434): (gGlobalSound hold: 20)
King's Quest 6, rm580.sc(601): (gGlobalSound hold: 30)
King's Quest 6, rm580.sc(663): (gGlobalSound hold: 30)
Leisure Suit Larry 1, rm190.sc(126): (sfxBlender play: hold: 10)
Leisure Suit Larry 1, rm505.sc(136): (sfxDialTone play: hold: 10) ; Nine times in this one script.
Leisure Suit Larry 1, rm610.sc(462): hold: 10
Leisure Suit Larry 1, rm610.sc(479): (gLongSong2 hold: 20)
Leisure Suit Larry 5, PushButton.sc(80): hold: 10
Leisure Suit Larry 5, rm250.sc(651): (theMusic3 number: 255 loop: 1 play: self hold: 10)
Leisure Suit Larry 5, rm310.sc(648): (gLongSong number: 311 loop: 1 play: hold: 10)
Leisure Suit Larry 5, rm700.sc(365): (soundFX number: 255 play: hold: 10)
Leisure Suit Larry 5, rm700.sc(374): (soundFX hold: -1)
Leisure Suit Larry 5, rm850.sc(491): (gLongSong2 number: 853 play: hold: 10)
Leisure Suit Larry 6, cObj_620.sc(160): (bedFx number: 621 loop: -1 play: hold: 1) ; twice in this script.
Leisure Suit Larry 6, rm130.sc(147): (limoSFX play: 0 hold: 1 fade: 127 15 21 0)
Leisure Suit Larry 6, rm130.sc(237): (limoSFX hold: 3)
Leisure Suit Larry 6, rm130.sc(546): (if (== (wheel1 moveSpeed?) 0) (limoSFX hold: 2))
Leisure Suit Larry 6, rm380.sc(614): (sfxMachine play: hold: 1)
Leisure Suit Larry 6, rm380.sc(648): (sfxMachine hold: (+ local1 1))
Leisure Suit Larry 6, rm510.sc(204): hold: 1
Leisure Suit Larry 6, rm800.sc(539): hold: 1
Leisure Suit Larry 6, rm800.sc(565): (gGlobalSound1 hold: 2)
Leisure Suit Larry 6, rm800.sc(574): (gGlobalSound1 hold: 3)
Leisure Suit Larry 6, rm800.sc(578): (gGlobalSound1 hold: 4)
Leisure Suit Larry 6, rm800.sc(591): (gGlobalSound1 hold: 5)
Pepper's Adventures in Time, Main.sc(645): (if holdVal (self hold: holdVal))
Pepper's Adventures in Time, rm381.sc(58): (gLongSong number: 110 hold: 1 setLoop: -1 play:)
Police Quest 3, rm057.sc(249): (sFX hold: 1 play:)
Police Quest 4, rm240.sc(47): (gGlobalSound0 number: 505 setLoop: 1 play: hold: 1)
Police Quest 4, rm290.sc(222): (gGlobalSound0 hold: 2 client: self)
Police Quest 4, rm290.sc(226): (gGlobalSound0 number: 507 play: hold: 1)
Police Quest 4, rm290.sc(43): (gGlobalSound0 number: 505 setLoop: 1 play: hold: 1)
Police Quest 4, rm505.sc(249): (gGlobalSound0 number: 505 setLoop: 1 play: hold: 1)
Police Quest 4, rm505.sc(255): (gGlobalSound0 number: 507 play: hold: 1)
Quest for Glory 3, Glory.sc(2300): (if holdVal (self hold: holdVal))
Quest for Glory 3, Head.sc(33): (gOwner hold: 1 3 110)
Quest for Glory 3, openCart.sc(172): (gLongSong number: 100 play: 127 self hold: 1)
Quest for Glory 3, openCart.sc(187): (gLongSong hold: 2)
Quest for Glory 3, openCart.sc(267): (gLongSong hold: 3)
Quest for Glory 3, openCart.sc(277): (7 (gLongSong hold: 4))
Quest for Glory 3, openCart.sc(370): (gLongSong hold: 3)
Quest for Glory 3, openCart.sc(481): (gLongSong hold: 4)
Quest for Glory 3, openCart.sc(541): (gLongSong hold: 3)
Quest for Glory 3, openCart.sc(679): (gLongSong hold: 4)
Quest for Glory 3, rm270.sc(104): (gLongSong fade: 70 5 3 0 hold: 1) ; four times in this one script.
Quest for Glory 3, rm270.sc(337): (gLongSong number: 280 setLoop: -1 play: 1 hold: 1)
Quest for Glory 3, rm270.sc(348): (gLongSong number: 290 setLoop: -1 play: 1 hold: 1)
Quest for Glory 3, rm270.sc(359): (gLongSong number: 300 setLoop: -1 play: 1 hold: 1)
Space Quest 1, rm1.sc(268): (gLongSong2 number: 4 loop: 1 play: 40 hold: 1) ; twice in this script.
Space Quest 1, rm1.sc(296): (gLongSong2 number: 4 loop: 1 play: 80 hold: 1) ; twice in this script.
Space Quest 1, rm1.sc(323): (gLongSong2 number: 4 loop: 1 play: hold: 1) ; twice in this script.
Space Quest 1, rm13.sc(264): (gLongSong2 number: 328 loop: 1 flags: 1 play: hold: 1)
Space Quest 1, rm13.sc(328): (gLongSong2 number: 327 loop: 1 play: hold: 1)
Space Quest 1, rm13.sc(337): (gLongSong2 number: 327 loop: 1 flags: 1 play: hold: 1)
Space Quest 1, rm14.sc(219): (gSoundEffects number: 334 loop: -1 play: hold: 1)
Space Quest 1, rm35.sc(1314): (hoverSound number: 462 loop: 1 play: hold: 1)
Space Quest 1, rm40.sc(280): (gSoundEffects number: 609 loop: 1 play: hold: 1)
Space Quest 1, rm41.sc(490): (gLongSong2 number: 439 loop: -1 play: hold: 1) ; twice in this script.
Space Quest 1, rm44.sc(584): (gLongSong2 number: 628 loop: 1 flags: 1 play: hold: 1)
Space Quest 1, rm45.sc(710): (gSoundEffects number: 610 loop: 1 play: hold: 1)
Space Quest 1, rm50.sc(119): (gSoundEffects number: 502 loop: 1 play: hold: 1 fade:)
Space Quest 1, rm51.sc(754): (gLongSong2 number: 504 loop: 1 play: hold: 1)
Space Quest 1, rm53.sc(380): (gLongSong2 number: 504 loop: 1 play: self hold: 1)
Space Quest 1, rm54.sc(795): (gSoundEffects number: 515 loop: 1 play: hold: 1)
Space Quest 1, rm64.sc(236): hold: 1
Space Quest 1, rm64.sc(392): (emitterSound loop: -1 play: hold: 1)
Space Quest 1, rm64.sc(764): (gLongSong number: 516 loop: 0 play: hold: 1)
Space Quest 1, rm7.sc(46): hold: 1
Space Quest 1, Rock.sc(449): (motorSound play: hold: 1)
Space Quest 1, Sarien.sc(285): (if (== temp0 360) (gLongSong hold: 1))
Space Quest 4, rm072.sc(468): (if (HandsOn 0) (gLongSong2 hold: 1))
Space Quest 4, rm119.sc(21): (gLongSong2 hold: 2)
Space Quest 4, rm120.sc(23): (gLongSong2 hold: 3)
Space Quest 4, rm329.sc(58): (gLongSong2 number: 128 vol: 127 hold: 1 play:)
Space Quest 4, rm330.sc(89): (gLongSong playBed: hold: 1)
Space Quest 4, rm335.sc(197): (gLongSong hold: 2)
Space Quest 4, rm340.sc(48): (gLongSong hold: 3)
Space Quest 4, rm381.sc(1058): (aSound number: 830 loop: 0 play: prevSignal: 0 hold: 1)


SMF 2.0.14 | SMF © 2017, Simple Machines
Simple Audio Video Embedder

Page created in 0.108 seconds with 24 queries.