2010-06-10 12 views
9

के साथ सरल तरंगों का निर्माण करना मैं कोरऑडियो के लिए नया हूं, और मैं सीए का उपयोग कर स्पीकर के माध्यम से दी गई आवृत्ति और आयाम के साथ एक साधारण साइन लहर और स्क्वायर वेव आउटपुट करना चाहता हूं। मैं ध्वनि फ़ाइलों का उपयोग नहीं करना चाहता क्योंकि मैं ध्वनि को संश्लेषित करना चाहता हूं।CoreAudio

मुझे ऐसा करने की क्या ज़रूरत है? और क्या आप मुझे एक उदाहरण या ट्यूटोरियल दे सकते हैं? धन्यवाद।

उत्तर

14

पिछले उत्तर में कई त्रुटियां हैं। मैं, पौराणिक :-) जेम्स मैककार्टनी, जेम्स हार्किन्स ने साइनवेवेडेमो नहीं लिखा, मैंने सुपरकॉलिडर भी लिखा, जो audiosynth.com वेबसाइट है। मैं अब कोरऑडियो पर ऐप्पल में भी काम करता हूं। साइनवेवेडेमो कोरऑडियो का उपयोग करता है, क्योंकि यह CoreAudio.framework से ऑडियो चलाने के लिए ऑडियोहार्डवेयर.h का उपयोग करता है।

आपको साइनवेवेडेमो का उपयोग नहीं करना चाहिए। यह बहुत पुराना कोड है और यह ऑडियो हार्डवेयर के बफर लेआउट के बारे में खतरनाक धारणा बनाता है। आप जिस ध्वनि को उत्पन्न कर रहे हैं उसे चलाने के लिए आजकल सबसे आसान तरीका ऑडियोक्यूयू का उपयोग करना है, या रेंडर कॉलबैक सेट के साथ आउटपुट ऑडियो यूनिट का उपयोग करना है।

+1

पर निम्न स्तर के ऑडियो में एक अमूल्य अंतर्दृष्टि है। कोई सलाह कहां और कैसे शुरू करें "CoreAudio के साथ सरल तरंगों को बनाना "? – powtac

1

क्या आप सामान्य रूप से ऑडियो प्रोग्रामिंग के लिए नए हैं? एक प्रारंभिक बिंदु के रूप में मैं

http://www.audiosynth.com/sinewavedemo.html

की जाँच करेगा यह पौराणिक जेम्स हार्किंस द्वारा एक न्यूनतम OSX sinewave कार्यान्वयन है। ध्यान दें, यह कोरऑडियो का बिल्कुल उपयोग नहीं करता है।

यदि आप विशेष रूप से अपने साइनवेव के लिए कोरऑडियो का उपयोग करना चाहते हैं तो आपको आउटपुट यूनिट (आईफोन पर रिमोटियो, ओएसएक्स पर AUHAL) बनाने और इनपुट कॉलबैक की आपूर्ति करने की आवश्यकता है, जहां आप उपर्युक्त उदाहरण से कोड का अधिक उपयोग कर सकते हैं।

http://developer.apple.com/mac/library/technotes/tn2002/tn2091.html

वाले प्लग इन किया जा सकता है के लिए बाहर की जाँच करें CoreAudio के लाभ कर रहे हैं मुख्यतः अपने sinewave के साथ श्रृंखला अन्य प्रभाव, प्लगइन्स तर्क & की तरह मेजबान के लिए लिखना उनके लिए इंटरफेस प्रदान करते हैं एक मेजबान (तर्क) की तरह लिखना एक साथ बंधे

यदि आप प्लगइन लिखना नहीं चाहते हैं, या प्लगइन होस्ट नहीं करते हैं तो CoreAudio वास्तव में आपके लिए नहीं हो सकता है। लेकिन CoreAudio का उपयोग करने के बारे में सबसे अच्छी चीजों में से एक यह है कि एक बार जब आप अपना साइनवेव कॉलबैक काम कर लेते हैं तो इसे प्रभाव जोड़ने में आसान होता है, या कई साइनों को मिलाकर

ऐसा करने के लिए आपको अपनी आउटपुट इकाई को ग्राफ में रखना होगा, जिस पर आपको आप कर सकते हैं प्रभाव, मिक्सर, आदि

यहाँ रेखांकन http://timbolstad.com/2010/03/16/core-audio-getting-started-pt2/

यह रूप में मुश्किल के रूप में यह लग रहा है नहीं है की स्थापना पर कुछ मदद की है। ऐप्पल कई चीजों (/ डेवलपर/उदाहरण/कोरऑडियो/पब्लिक यूटिलिटी) के लिए सी ++ सहायक वर्ग प्रदान करता है और यहां तक ​​कि यदि आप सी ++ (आपको नहीं करना है!) का उपयोग नहीं करना चाहते हैं तो वे कोरऑडियो एपीआई के लिए उपयोगी मार्गदर्शिका हो सकते हैं।

+0

एमएमएम .. पहला उदाहरण (audiosynth.com ...) 11415 संकलन त्रुटियों देता है और यह काफी पुराना है (प्रोजेक्ट बिल्डर), लेकिन मैं इसका स्रोत कोड देख लूंगा। धन्यवाद –

+0

हां यह काफी पुराना है लेकिन काम करना मुश्किल नहीं है (मैं इसे यहां चला रहा हूं) और यह ओएसएक्स – hooleyhoop

1

यदि आप sin()math.h से फ़ंक्शन का उपयोग करके यह वास्तविक समय नहीं कर रहे हैं, तो यह बुरा विचार नहीं है। केवल पाप() के साथ आपको आवश्यक कई नमूनों को भरें, जब इसे खेलने का समय हो, तो बस इसे ऑडियो बफर पर भेजें। पाप() प्रत्येक नमूने में एक बार कॉल करने में काफी धीमा हो सकता है यदि आप इस रीयलटाइम को कर रहे हैं, तो एक इंटरपोलेटेड वेवेटेबल लुकअप विधि का उपयोग करके बहुत तेज है, लेकिन परिणामस्वरूप ध्वनि स्पेक्ट्रल शुद्ध नहीं होगी।

2

(यह तकनीकी रूप से एक wavetable कहा जाता है)

CoreAudio धागा से बुलाया प्लेबैक समारोह में लहर के एक चक्र से युक्त, कि फ़ाइलों के बिना एक चक्र बफर तैयार करने के लिए है करने के लिए सबसे अच्छा और आसान तरीका है, को भरने तरंग बफर से नमूने के साथ आउटपुट बफर।

ध्यान दें कि आपको दो समस्याओं का सामना करना पड़ेगा: - साइन लहर के लिए, यदि प्लेबैक आवृत्ति वांछित साइन आवृत्ति का पूर्णांक नहीं है, तो आपको शायद एक इंटरपोलेटर लागू करने की आवश्यकता होगी यदि आप चाहते हैं एक अच्छी गुणवत्ता। केवल पूर्णांक पॉइंटर्स का उपयोग हार्मोनिक शोर का एक महत्वपूर्ण स्तर उत्पन्न करेगा।

  • वर्ग लहर के लिए, केवल +1/-1 मानों के साथ एक सरणी प्रोग्राम करने से बचें। ऐसा संकेत बैंड असीमित नहीं है और इसके अलावा बहुत कुछ होगा। यह मत भूलना कि एक वर्ग लहर का स्पेक्ट्रम लगभग अनंत है!

संकेत पीढ़ी के लिए अच्छा एल्गोरिदम पाने के लिए, एक बार देख ले musicdsp.org को, कि शायद उस

0

करने का सर्वोत्तम स्थान में से एक वहाँ में एक अच्छा और अच्छी तरह से प्रलेखित साइन वेव खिलाड़ी कोड उदाहरण है एडमसन/अविला "सीखना कोर ऑडियो" पुस्तक, एडिसन-वेस्ले व्यावसायिक द्वारा प्रकाशित के अध्याय 7 (ISBN-10: 0-321-63684-8):

http://www.informit.com/store/learning-core-audio-a-hands-on-guide-to-audio-programming-9780321636843

यह एक नहीं बल्कि नए प्रकाशन है (2012) और पते पीआर इस सवाल का पारिस्थितिक रूप से मुद्दा। यह केवल एक शुरुआती बिंदु है, लेकिन यह एक मूल्यवान प्रारंभिक बिंदु है।

बीटीडब्ल्यू। इस बुनियादी पाठ (जिसमें कुछ गणित शामिल है) होने से पहले ग्राफ पर कूदें।

उदाहरण कोड के बारे में, एक त्वरित और कुशल विधि मैं प्रायः प्री-भरे हुए साइनवेव लुकअप टेबल के साथ सौदों का उपयोग करता हूं जिसमें नमूना दर के रूप में कई सदस्य हैं, 44100 हर्ट्ज के लिए तालिका 44100 का आकार है। दूसरे शब्दों में, चक्र की लंबाई नमूना दर के बराबर है। यह कई मामलों में गति और गुणवत्ता के बीच स्वीकार्य व्यापार-बंद देता है। आप इसे प्रोग्राम के साथ शुरू कर सकते हैं।
आप चल बिन्दु नमूने (जो OSX में डिफ़ॉल्ट है) उत्पन्न करते हैं, और गणित कार्यों का उपयोग करते हैं, उपयोग sinf() बजाय (नाव) पाप()। रेंडर कॉलबैक के आंतरिक लूप चक्रों में प्रचार हमेशा संसाधन-महंगा होते हैं। तो 2.0 * M_PI, जो अक्सर कोड उदाहरणों में पाया जा सकता है, के स्थिरांक के दोहराव गुणक हैं।

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