2010-02-06 3 views
0

사인파의 경로에 사운드의 피치를 지정하여 내 OpenAL 오브젝트에 내 자신의 연속 피치 변조 (비브라토)를 추가하려고합니다. 이것은 1/30 초마다 반복되는 콜백 메소드와 피치에 대한 getter 및 setter입니다.값을 변경하는 동안 값 변경을 보상 하시겠습니까?

#define kMaximumAplitude 0.025 
#define kVibratoDegreeIncrements is 45 
#define kDegreesToRadians(x) (M_PI * (x)/180) 

- (void)vibratoCallBack:(NSTimer *)timer 
     { 
     float newPitch = kMaximumAplitude * sin(kDegreesToRadians(vibratoDegreeIncrements)); 
     self.pitch += newPitch; 

     vibratoDegreeIncrements += kVibratoDegreeIncrements; 
     } 

- (void)setPitch:(ALfloat)newPitch 
{ 
pitch = newPitch; 
alSourcef(sourceID, AL_PITCH, pitch); 
} 

- (ALfloat)pitch 
{ 
return pitch; 
} 

는 기본 피치는 1.0로 설정, 그래서 위의 출력은 다음 정현파주기입니다 : 당신이 그 숫자를 보면

Wrong Pitch: 1.000000 
Wrong Pitch: 1.017678 
Wrong Pitch: 1.042678 
Wrong Pitch: 1.060355 
Wrong Pitch: 1.060355 
Wrong Pitch: 1.042678 
Wrong Pitch: 1.017678 
Wrong Pitch: 1.000000 

그러나, 그들은 사인파의 많은 수 없습니다. 그 이유는 내가 볼 수있는 한, self.pitch가 사인파 증분과 함께 추가된다는 것입니다. 비브라토 방법의 피치 변경 이전에 기본 피치 (변조되지 않은 피치)를 일정하게 유지하고 싶습니다. 이렇게하면 UISlider (예를 들어)를 사용하여베이스 피치를 계속 제어 할 수있게되는 반면, 변조 효과는베이스 피치에 영향을주지 않고 선택적으로 정확하게 발생할 수 있습니다. 나는 길을 찾을 수 없다. 현재, 변조 피치가 1.5에있는 경우

Correct Pitch: 0.000000 
Correct Pitch: 0.017678 
Correct Pitch: 0.025000 
Correct Pitch: 0.017678 
Correct Pitch: 0.000000 
Correct Pitch: -0.017678 
Correct Pitch: -0.025000 
Correct Pitch: -0.017678 
Correct Pitch: -0.000000 

따라서, I는 다음과 같이 출력을하고자 아래

내가하려는 적절한 정현파 출력이 현재의 피치에 추가하는 것 :

Desired Pitch: 1.500000 
Desired Pitch: 1.517678 
Desired Pitch: 1.525000 
Desired Pitch: 1.517678 
Desired Pitch: 1.500000 
Desired Pitch: 1.482322 
Desired Pitch: 1.475000 
Desired Pitch: 1.482322 
Desired Pitch: 1.500000 

피치를 실제로 변경하지 않고 어떻게 변경할 수 있습니까? 그 방법이 움직이는 (또는 움직일 수있는)베이스 피치에서 효과가 발생할 수 있도록 변조 방법을 보상하는 방법이 있습니까?

+1

어디에 문제가 있는지 잘 모르겠습니다. 당신은베이스가 측정치의 무차별 체가되기를 원합니다. 원하는 피치 = Basepitchvar + Measurement. 그러면 Basepitchvar를 동적으로 변경할 수 있습니다. – joejoeson

+0

문제는 사운드가 재생되는 동안 라이브로 발생한다는 것입니다. 비브라토를 실행하려면, 사운드의 음조에 파형을 지정해야합니다 : self.pitch + = newPitch; 개체의 피치가 변경되었으므로 모든 추가 파형 증분이 새로운 변경된 피치에 적용됩니다. – TheDarkIn1978

+0

나는베이스 피치를 유지하면서베이스 피치에 비브라토 웨이브 폼을 지정하는 법을 모릅니다. 플레이 중에베이스 피치에서 적절한 비브라토를 변경하고 실행할 수 있습니다. 물론 – TheDarkIn1978

답변

1

데이터를 분리해야한다고 생각합니다. 한 피치가베이스 피치를 저장하도록하십시오. 수정되지 않은 사인파가됩니다. 그런 다음 비브라토 음파를 생성하는 또 다른 방법이 필요합니다. 이것은베이스 피치와 동기화됩니다. 그런 다음 최종 파형의 현재 피치를 반환하는 게터가 필요합니다. 다시 말해, 최종 파형의 피치를 저장할 필요가 없습니다. 지금하고있는 것처럼 필요에 따라 계산하면됩니다.

- (ALfloat) getFinalPitch 
{ 
return getBasePitch() + getVibratoPitch(); 
} 
+0

! 왜 내가 그걸 몰랐어?! 고맙습니다! 나는 당신을 투표 하겠지만 아직 충분한 담당자가 없습니다. 나는 정신으로 당신을 투표 :) – TheDarkIn1978

+0

롤 내가 기꺼이 도울 수있어! 나는 내가 분명히 자신을 설명하지 않을까 걱정했다. 나는 전화로 글을 쓰려고한다! :피 – Dolph

관련 문제