Bugged native: SetSoundPitch()

Zwiebelchen

You can change this now in User CP.
Reaction score
60
For some reason, the [ljass]SetSoundPitch()[/ljass] native seems to be bugged.

Let's look at some code here:
JASS:
    local sound s1 = CreateSound("war3mapImported\\PiccoloA5.mp3", false, false, false, 10, 10, "")
    call StartSound(s1)
    call SetSoundPitch(s1, 1)
    call TriggerSleepAction(3)
    call SetSoundPitch(s1, 1.3)
    call StartSound(s1)
    call TriggerSleepAction(3)
    call StartSound(s1)
    call SetSoundPitch(s1, 1.301)
    call TriggerSleepAction(3)
    call StartSound(s1)
    call SetSoundPitch(s1, 1.302)

The first sound has the correct pitch of 1.
The second sound has the correct pitch of 1.3
The third sound has a pitch of 1.3^2
The fourth sound has a pitch of 1.3^2

JASS:
local sound s1 = CreateSound("war3mapImported\\PiccoloA5.mp3", false, false, false, 10, 10, "")
call StartSound(s1)
call SetSoundPitch(s1, 1)
call TriggerSleepAction(3)
call SetSoundPitch(s1, 1.3)
call StartSound(s1)
call TriggerSleepAction(3)
call StartSound(s1)
call SetSoundPitch(s1, 1.3)
call TriggerSleepAction(3)
call StartSound(s1)
call SetSoundPitch(s1, 1.302)

First Sound: 1.0
Second Sound: 1.3
Third Sound: 1.3
Fourth Sound: 1.3^2

Now that this wasn't weird enough, there is more:
JASS:
    local sound s1 = CreateSound("war3mapImported\\PiccoloA5.mp3", false, false, false, 10, 10, "")
    call StartSound(s1)
    call SetSoundPitch(s1, 1)
    call TriggerSleepAction(3)
    call SetSoundPitch(s1, 1.3)
    call StartSound(s1)
    call TriggerSleepAction(3)
    call StartSound(s1)
    call SetSoundPitch(s1, 1)
    call TriggerSleepAction(3)
    call StartSound(s1)
    call SetSoundPitch(s1, 1.3)

Real pitch values:
First Sound: Pitch 1
Second Sound: Pitch 1.3
Third Sound: Pitch 1.3 (??)
Fourth Sound: Pitch 1.3 (????)

Same goes for
JASS:
    local sound s1 = CreateSound("war3mapImported\\PiccoloA5.mp3", false, false, false, 10, 10, "")
    call StartSound(s1)
    call SetSoundPitch(s1, 1)
    call TriggerSleepAction(3)
    call SetSoundPitch(s1, 1.3)
    call StartSound(s1)
    call TriggerSleepAction(3)
    call StartSound(s1)
    call SetSoundPitch(s1, 1.001)
    call TriggerSleepAction(3)
    call StartSound(s1)
    call SetSoundPitch(s1, 1.301)

Real pitches:
1.0
1.3
1.3 (???)
1.3

And now to make it even more weird:
JASS:
    local sound s1 = CreateSound("war3mapImported\\PiccoloA5.mp3", false, false, false, 10, 10, "")
    call StartSound(s1)
    call SetSoundPitch(s1, 1)
    call TriggerSleepAction(3)
    call SetSoundPitch(s1, 1.3)
    call StartSound(s1)
    call TriggerSleepAction(3)
    call StartSound(s1)
    call SetSoundPitch(s1, 1.301)
    call TriggerSleepAction(3)
    call StartSound(s1)
    call SetSoundPitch(s1, 1)

1.0
1.3
1.3^2
1.3 (?????)

I give up ... I can not find ANY logical pattern here. Someone please help; am I missing something? If someone can give me a reason for this weird behaviour, please help!
I want to write a SetSoundPitchEx function, but without a logical pattern, there's nothing I can do about it.

PS: Changing the Length of the TriggerSleepAction or Starting the Sound after or before setting the sound pitch does not make any difference.

PS2: It's not the number of digits. SetSoundPitch allows for very precise digit reading, as the half note shifting base (1.05965^n) creates exact in-tune values (I tested it with a chromatic tuner).
 

Zwiebelchen

You can change this now in User CP.
Reaction score
60
In case someone cares:
I've found a workaround to this, by using this function, which seems to work 100% of the time - only bad thing is that you need to remember the last pitch value in order to make it work:

JASS:
function SetSoundPitchEx takes sound s, real pitch, real lastpitch returns nothing
    if not GetSoundIsPlaying(s) then
        if pitch == 1 then
            call SetSoundPitch(s, 1.0001)
        else
            call SetSoundPitch(s, pitch)
        endif
    else
        call SetSoundPitch(s, 1/lastpitch)
        call SetSoundPitch(s, pitch)
    endif
endfunction
 

GFreak45

I didnt slap you, i high 5'd your face.
Reaction score
130
i believe the issue is that... in a normal instance where you set the sound pitch to a value not equal to itself, it multiplies the current pitch by that ammount. In the off instance where you set the pitch to itself, it does nothing, as though you had just [ljass]set x = x[/ljass], very very odd glitch indeed, but I am not suprised blizzard had something like this in there
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top