2016-04-22 13 views
6

मैं केवल 6 ऑडियो क्लिप का उपयोग करके गिटार की पूरी श्रृंखला को फिर से बनाने की कोशिश कर रहा हूं।ऑडियोक्लिप के लिए फ्रीक्वेंसी और पिच रिलेशन - यूनिटी 3 डी

मैं सोच रहा था कि एक ऑडियो क्लिप की आवृत्ति सेट करने का एक तरीका होगा लेकिन ऑडियो। फ्रीक्वेंसी केवल संपीड़न प्रारूप के आधार पर ऑडियो की आवृत्ति देता है, न कि वास्तविक स्वर।

मुझे पता है कि मैं GetSpectrumData पढ़ सकता हूं, लेकिन यह समाधान काफी जटिल है और इसके लिए कुछ फूरियर ट्रांसफॉर्म विश्लेषण या किसी प्रकार की आवश्यकता होगी।

पिच को प्रभावित करना, स्वर को बदलना आसान है, इसलिए मैं ऊपर और नीचे जा सकता हूं लेकिन इसका उपयोग करने के लिए क्या कदम हैं इसका पता लगाने का कोई तरीका है।

void Update() 
{ 
    CheckAudio(KeyCode.Q, 1.0f); 
    CheckAudio(KeyCode.W, 1.1f); 
    CheckAudio(KeyCode.E, 1.2f); 
    CheckAudio(KeyCode.R, 1.3f); 
    CheckAudio(KeyCode.T, 1.4f); 
} 

void CheckAudio(KeyCode key, float pitch) 
{ 
    if (Input.GetKeyDown (key)) 
    { 
     audio.pitch = pitch; 
     audio.Play(); 
    } 
} 

मैं यह सही नहीं लग रहा सुन सकते हैं।

1 पर पिच के साथ शुरुआती स्वर E4 329.63Hz को जानना क्या पिच को प्रभावित करने वाला कोई समीकरण है, मुझे अगली कुंजी F4 349.23Hz (या पर्याप्त बंद) मिल जाएगी?

यह भी माना जाना चाहिए कि यूनिटी ऑडियोसोर्स 3/3 रेंज के भीतर पिच को सीमित करता है (जो मुझे लगता है कि ज़रूरी है)।

संपादित करें: कुछ व्यक्तिगत शोध जोड़ना। ऐसा लगता है कि पिच 1 प्रारंभिक नोट है और 2 को सेटिंग एक ही कुंजी एक ऑक्टेट उच्च प्रदान करती है।

चूंकि एक वर्णक्रमीय पैमाने (पियानो पर सभी काले और सफेद नोट्स) 12 कुंजी हैं, मुझे लगता है कि प्रत्येक चरण के लिए 1/12 का उपयोग करना चाहिए।

यह करीब लगता है लेकिन मैं गिर गया यह बिल्कुल सही नहीं है। यहाँ नए कोड है:

[SerializeField] private AudioSource audio; 
float step = 1f/12f; 
KeyCode[]keys = new KeyCode[]{ 
    KeyCode.Q, KeyCode.W,KeyCode.E,KeyCode.R,KeyCode.T, 
    KeyCode.Y, KeyCode.U, KeyCode.I, KeyCode.O, KeyCode.P, 
    KeyCode.A, KeyCode.S, KeyCode.D 
}; 

void Update() 
{ 
    float f = 0.0f; 
    foreach (KeyCode key in keys) 
    { 
     CheckAudio(key, f); 
     f += 1f; 
    } 
} 

void CheckAudio(KeyCode key, float pitch) 
{ 
    if (Input.GetKeyDown (key)) 
    { 
     audio.pitch = 1f + pitch * step; 
     audio.Play(); 
    } 
} 

उत्तर

5

आप बस ऑडियो के पिच बदलकर अच्छी तरह से नहीं काम करेगा करने के लिए कोशिश कर रहे हैं। पिच बदलने से, आप अन्य समस्याओं जैसे ध्वनि खत्म करने के लिए बहुत तेज या खत्म करने के लिए अधिक समय लेते हैं और ध्वनि भी अच्छा नहीं होगा।

पहले समाधान सी ++ में एक प्लगइन (सिंथेसाइज़र) कि एकता से ऑडियो फ़ाइल पढ़ता बनाने के लिए और आवृत्ति को बदलने के लिए है। इसे गति के मुद्दों को ठीक करने के लिए अन्य कार्रवाइयां भी करनी चाहिए। यह बहुत जटिल है जब तक कि आप कुछ महान गणित कौशल के साथ एक ऑडियो इंजीनियर नहीं हैं। और एक मोबाइल डिवाइस पर यह कोशिश पूरी कहानी है। OnAudioFilterRead एक ऐसा फ़ंक्शन है जिसका उपयोग आप इस विधि के साथ जाने का निर्णय लेते हैं।

दूसरा और सिफारिश समाधान के लिए एक ऑडियो फ़ाइल बनाने के लिए प्रत्येक गिटार कुंजी तो audioClip की सरणी में डाल रहा है। यह प्रत्येक अन्य समस्याओं को हल करता है। नीचे की तरफ यह है कि आपके पास और फ़ाइलें होगी।

संपादित करें:

आप इसे सही होने के बारे में परवाह नहीं है, तो आप internet पर इस अच्छा लड़का से नीचे कुछ का उपयोग कर सकते हैं।

void playSound(){ 
    float transpose = -4; 
    float note = -1; 
    if (Input.GetKeyDown("a")) note = 0; // C 
    if (Input.GetKeyDown("s")) note = 2; // D 
    if (Input.GetKeyDown("d")) note = 4; // E 
    if (Input.GetKeyDown("f")) note = 5; // F 
    if (Input.GetKeyDown("g")) note = 7; // G 
    if (Input.GetKeyDown("h")) note = 9; // A 
    if (Input.GetKeyDown("j")) note = 11; // B 
    if (Input.GetKeyDown("k")) note = 12; // C 
    if (Input.GetKeyDown("l")) note = 14; // D 

    if (note>=0){ // if some key pressed... 
     audio.pitch = Mathf.Pow(2, (note+transpose)/12.0); 
     audio.Play(); 
} 

संपादित करें: आप में से जो क्यों Mathf.Pow समीकरण का इस्तेमाल किया और काम कर रहा है में रुचि के लिए, निम्न पढ़ें: https://en.wikipedia.org/wiki/Twelfth_root_of_two

+0

हाँ मैं दूसरा समाधान के बारे में सोचा लेकिन स्कैनिंग था अगर वहाँ एक और अधिक हो जाएगा आपके द्वारा उल्लिखित डाउनसाइड्स से बचने के लिए प्रोग्रामेटिक दृष्टिकोण। अब जब आप इसे लाएंगे, तथ्य यह है कि पिच ऊपर जाने के दौरान ध्वनि कम हो सकती है। एक गिटार के बारे में सोचते हुए, जैसे आप fretboard ऊपर जाते हैं, स्ट्रिंग कम होती है और कम समय तक गूंजती है। चूंकि यह एक निजी शोध परियोजना है, मुझे लगता है कि मैं पूरी तरह से सही समाधान के साथ जाऊंगा। फिर भी धन्यवाद। – Everts

+0

@Everts यदि आपको इस बात की परवाह नहीं है कि यह कितना सही है, तो आप उस कोड को अभी संपादित किए गए संपादन से आजमा सकते हैं। यह मुझसे नहीं है लेकिन मैंने एक लिंक रखा जहां से यह आया था। मुझे लगता है कि वह समीकरण है जिसे आप शायद ढूंढ रहे हैं। – Programmer

+0

ठीक है संपादन वास्तव में पर्याप्त से अधिक है। मैं कुछ ऑनलाइन पियानो की तुलना कर रहा हूं और यह ठीक है। इसके लिए बहुत धन्यवाद। – Everts

संबंधित मुद्दे