মাইক্রোকন্ট্রোলার থেকে পলিফোনিক শব্দগুলি?


14

পাইজো বুজারের সাথে সংযুক্ত একটি একক পিন ( বিভিন্ন হারে ) টগল করে আমি মনোফোনিক শব্দ করতে পারি ।

পলিফনি তৈরি করতে আমি কীভাবে সফ্টওয়্যারটিতে দুটি মিশ্র অডিও সংকেত তৈরি করতে পারি?

আমি একটি সাধারণ টিউন খেলতে কোডটি এখানে ব্যবহার করছি।

#define F_CPU 8000000UL // 8MHz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>

// number of timer0 overflows/sec
#define INT_PER_SEC 31250

// Frequencies (in Hz) of notes
#define F_FSH_4 370
#define F_A_4 440
#define F_B_4 494
#define F_E_4 330
#define F_CSH_5 554
#define F_D_5 587
#define F_FSH_5 740
#define F_CSH_4 277
#define F_GSH_4 415

// number of timer0 overflows for notes
#define REST -1 // special case
#define FSH_4 INT_PER_SEC/F_FSH_4
#define A_4 INT_PER_SEC/F_A_4
#define B_4 INT_PER_SEC/F_B_4
#define E_4 INT_PER_SEC/F_E_4
#define CSH_5 INT_PER_SEC/F_CSH_5
#define D_5 INT_PER_SEC/F_D_5
#define FSH_5 INT_PER_SEC/F_FSH_5
#define CSH_4 INT_PER_SEC/F_CSH_4
#define GSH_4 INT_PER_SEC/F_GSH_4

#define SEMIQUAVER_TIME 60  // ms
#define BREATH_TIME 20      // ms

volatile uint32_t intrs = 0;
volatile int32_t curNote = REST;

// TIMER0 overflow
ISR(TIMER0_OVF_vect)
{
    if (curNote == REST)
        intrs = 0;
    else
    {
        intrs++;
        if (intrs >= curNote)
        {
            PORTD ^= _BV(PD4);
            intrs = 0;
        }
    }
}


void play(int32_t note, uint32_t len)
{
    int i;
    curNote = note;
    for (i = 0; i< len; i++)
        _delay_ms(SEMIQUAVER_TIME);
    curNote = REST;
    _delay_ms(BREATH_TIME);
}

int main(void)
{
    /* setup clock divider. Timer0 overflows on counting to 256.
     * 8Mhz / 1 (CS0=1) = 8000000 increments/sec. Overflows every 256, so 31250
     * overflow interrupts/sec */
    TCCR0B |= _BV(CS00);

    // enable overflow interrupts
    TIMSK0 |= _BV(TOIE0);

    // PD4 as output
    DDRD = _BV(PD4);

    TCNT0 = 0;
    intrs = 0;

    curNote = REST;

    // enable interrupts
    sei();

    while (1)
    {
        // Axel F
        play(FSH_4, 2);
        play(REST, 2);
        play(A_4, 3);
        play(FSH_4, 2);
        play(FSH_4, 1);
        play(B_4, 2);
        play(FSH_4, 2);
        play(E_4, 2);
        play(FSH_4, 2);
        play(REST, 2);
        play(CSH_5, 3);
        play(FSH_4, 2);
        play(FSH_4, 1);
        play(D_5, 2);
        play(CSH_5, 2);
        play(A_4, 2);
        play(FSH_4, 2);
        play(CSH_5, 2);
        play(FSH_5, 2);
        play(FSH_4, 1);
        play(E_4, 2);
        play(E_4, 1);
        play(CSH_4, 2);
        play(GSH_4, 2);
        play(FSH_4, 6);
        play(REST, 12);
    }
}

আরে এই জিনিসটি কি মানুষের ভাষা নির্গত করতে পারে? মানে শব্দের মতো?
রিক_2047

1
ক্যানটারিনো - কোড. google.com/p/tinkerit/wiki/Cantarino
টবি জাফি

@ জোবি আপনি যে সংস্থানটি দিয়েছিলেন তা দুর্দান্ত ছিল তবে আমি ডেমোটি দেখেছি, এটি আসলে শ্রুতিমধুর কিছু বলছে না nyআপনি অন্য কেউ কি জানেন?
রিক_2047

একটি ড্যাক ছাড়া না, না।
টবি জাফি ২:11

@ জোবি আপনার কাছে একটি ড্যাকের কী আছে?
রিক_2047

উত্তর:


8

ওয়েল একটি সহজ কৌশল হ'ল পিডব্লুএম এর সাথে দুটি পিন ব্যবহার করা এবং স্পিকারের বিপরীত দিকগুলিতে তাদের বেঁধে দেওয়া। তারপরে প্রতিটি পিনকে আলাদা গতিতে মডিউল করুন এবং আপনি একবারে দুটি নোট খেলতে পারেন ... মূলত স্পিকার আপনার জন্য এটি একসাথে মিশিয়ে দিচ্ছে। উল্লিখিত হিসাবে দুটিরও বেশি নোট এবং আপনাকে এটি সফ্টওয়্যারে করতে হবে।


1
আপনি যদি পিডব্লিউএম ব্যবহার করেন (পছন্দসই সংকেতের তুলনায় অনেক বেশি ফ্রিকোয়েন্সি স্যুইচ করছেন), তবে আপনি ইতিমধ্যে কেবলমাত্র একটি আউটপুট পিন ব্যবহার করে একাধিক সংকেত একসাথে মেশাতে পারেন।
এন্ডোলিথ

5

পলিফনি পাওয়ার স্ট্যান্ডার্ড উপায়টি হ'ল কিছু স্থির বাধা হারে বাধা দেওয়া (প্রায়শই 8000 হার্জ বা 44100 হার্জেড), প্রতিটি শব্দ উত্স থেকে একটি "উচ্চ" (+1) বা "নিম্ন" (-1) (বা মধ্যবর্তী কিছু) পান , মোট পেতে সমস্ত সংখ্যা যুক্ত করুন, তারপরে সেই মোট সংখ্যাটি ডিএসি থেকে প্রেরণ করুন।

অন্যরা যেমন এখানে বলেছে, কিছুটা চালাকতার সাথে একটি উচ্চ-গতির পিডাব্লুএমএম একটি ড্যাক প্রতিস্থাপন করতে পারে।

"মাইক্রোকন্ট্রোলার polyphony" পৃষ্ঠা আরো কিছু বিবরণ এবং টিপস দেয়।


3

আমি মনে করি এই দুর্দান্ত পুরাতন ছোট্ট পিসি ডস গেম রত্নটি পিসি স্পিকারের মাধ্যমে বাস্তব পলিফোনিক শব্দ ব্যবহার করেছে: ডিগার

তারা কীভাবে এটি তৈরি করেছে আমি জানি না, তবে আপনি সাইট থেকে সি উত্স কোডটি ডাউনলোড করতে পারেন।


আমি এখনও আমার মাথায় সুরটি শুনতে পাচ্ছি
টবি জাফি

2

এটি সহায়তা করতে পারে -> সাধারণ পিডব্লিউএম ড্যাক


অরডিনোকে অবিচ্ছিন্নভাবে নোটগুলি খেলতে আপনাকে এমআইডিআই এর মতো একটি সিস্টেম ব্যবহার করতে হবে - নোট অন এবং নোট বন্ধের জন্য পৃথক কমান্ড সহ, স্বরযুক্ত গ্রন্থাগারটি এটি করে তবে পলিফনি করে না - তবে সর্বশেষতম সংস্করণটি দেখে মনে হচ্ছে এটি করে - Code.google.com/p/rogue-code/wiki/ToneLibraryDocamentation
জিম

2

আপনি কেবল দুটি বর্গাকার তরঙ্গ যুক্ত করতে পারেন এবং স্পিকারের "এনালগ" সিগন্যাল আউটপুট দিতে দ্রুত পিডব্লিউএম ব্যবহার করতে পারেন।

আপনি গেমের শব্দ, দ্রুত এবং ময়লা পছন্দ করতে পারলে এখানে আরও একটি আলাদা পদ্ধতি রয়েছে:

https://gitweb.bl0rg.net/cgi-bin/gitweb.cgi?p=arduinisten.git;a=blob;f=projekte/soundz/arpeggio/arpeggio.pde;h=6ceb64a57916c094e87e5983c07b5dd1b4623083;hb=HEAD


2

আপনি যদি আপনার স্পিকার ইভেন্টগুলির সময় সফ্টওয়্যার ব্যবহার করে থাকেন তবে সবচেয়ে সহজ পদ্ধতির মধ্যে সম্ভবত দুটি স্বতন্ত্র ডেটা স্ট্রিম তৈরি করা এবং এগুলির মধ্যে বিকল্প হতে পারে। এই স্পিকার আউটপুটটি আই / ও পিন বা কোনও ড্যাক দ্বারা নিয়ন্ত্রিত কিনা তা বেশ কার্যকরভাবে কাজ করতে পারে। উদাহরণ স্বরূপ:

int নির্বাচক;
uint16_t পর্যায় [8], ফ্রিক [8];

অকার্যকর বাধা (শূন্য) { নির্বাচক ++,; নির্বাচক & = 7; পর্ব [নির্বাচক] + ফ্রিক [নির্বাচক]; ড্যাক_আউট = সাইনওয়েভ [পর্ব [নির্বাচক] >> 8]; }

উপরেরটি হল 1996 সালে আমি পিক-ভিত্তিক সংগীত বাক্সে (সি পরিবর্তে অ্যাসেম্বলি কোড ব্যবহার করে) ব্যবহার করেছি approach নোট করুন যে বিঘ্নিত হার কার্যকর নমুনা হারের 8 গুণ হতে হবে, তবে প্রতিটি বাধা কেবলমাত্র একটি ভয়েসের জন্য প্রক্রিয়াজাতকরণ করতে হয়। মনে রাখবেন যে যদি আউটপুট ফিল্টারিং ভাল হয় তবে এই পদ্ধতির ফলে কার্যকর ডিএসি রেজোলিউশনের 3 বিট আরও বেশি পাওয়া যাবে যেগুলি নমুনাগুলিকে সংখ্যার সাথে যুক্ত করে তারপরে আউটপুট দেয় তবে এটি নমুনা হার এবং এর বহুগুণে প্রচুর শব্দ উত্পন্ন করবে noise ফিল্টারিং এটি অন্যথায় হওয়ার চেয়ে আরও বেশি গুরুত্বপূর্ণ।


1

তারা পুরানো গেম সিস্টেমগুলিতে এবং " পিসি স্পিকার " এর দিনগুলিতে এটি করত , তবে আমি জানি না।

প্রথম অনুমান: আপনি যে তরঙ্গটি আদর্শভাবে তৈরি করবেন তার কথা চিন্তা করুন, তারপরে এটিকে একটি বিশাল আকারের ক্লিপড বর্গক্ষেত্র আকারে বিকৃত করে কল্পনা করুন, তারপরে উপযুক্ত সময়ে আপনার আউটপুট টগল করে সেই বর্গাকার আকৃতিটি তৈরি করুন। যদিও প্রচুর ইন্টারমোডুলেশন হবে

দ্বিতীয় চিন্তা: আপনি কি দোলনের ফ্রিকোয়েন্সি এবং আউটপুট এনালগ সংকেতগুলিকে পিডব্লিউএম-স্টাইল বাড়িয়ে দিতে পারেন ?


2
আমি মনে করি অনেকদিন আগে এনইএস এমুলেটরটি দেখেছিলাম এবং আমি বিশ্বাস করি যে তারা প্রোগ্রামেবল ফ্রিকোয়েন্সি সহ প্রত্যেকে তিনটি তরঙ্গরূপ ব্যবহার করেছেন। দুটি বর্গাকার তরঙ্গ এবং একটি ত্রিভুজ তরঙ্গ।
mjh2007

... এবং একটি শব্দ উত্স, দৃশ্যত। en.wikedia.org/wiki/NES_Sound_ Format
এন্ডোলিথ

1

যেমনটি উল্লেখ করা হয়েছে আপনি পিসি স্পিকারের সাথে এটি একইভাবে করতে পারতেন (যা কেবলমাত্র পিডাব্লুএম নিয়ন্ত্রণকারীর সাথে সংযুক্ত on এত দ্রুত যে এটি কখনই সম্পূর্ণরূপে চালু বা বন্ধ হয় না (কিছুটা স্যুইচ-মোড পাওয়ার সরবরাহ কীভাবে কাজ করে like এটির মত) এটি স্পিকারটি অবিচ্ছিন্ন সিগন্যাল তৈরি করে অবিচ্ছিন্নভাবে চলতে থাকে এবং বন্ধ করে দেয়।

কেবলমাত্র গ্যাচাগুলি হ'ল আপনার সত্যিকারের স্পিকারের প্রয়োজন (আমার মনে হয় পাইজো এত তাড়াতাড়ি চলে যায় যা খুব দ্রুত পূর্ণ হয়ে যায় এবং খুব তাড়াতাড়ি পূর্ণ হয়) এবং আপনাকে কিছুটা দ্রুত টগল করতে সক্ষম হতে হবে। আমি কিছু পরীক্ষা-নিরীক্ষা করেছি এবং সর্বাধিক গতিতে 5MHz নিয়ে এসেছি যা 11,025 Hz অডিও সিগন্যালের জন্য যথেষ্ট হওয়া উচিত (সম্ভবত আপনি যে সেরা মানের আশা করতে পারেন could)

অবশ্যই 11025Hz @ 8-বিট 11 কিলোবাইট / সেকেন্ড যা সিরিয়াল বন্দরটির গতির চেয়ে অনেক দ্রুত faster এটি কেবল দ্বিতীয় বা দুটি মূল্যের অডিও ফ্ল্যাশগুলিতে সংরক্ষণের অনুমতি দেবে, সুতরাং আপনি ফ্লাইতে উত্পন্ন অডিও বাজানোতে সীমাবদ্ধ থাকবেন, যা স্পিকারকে পিছনে ফেলে পর্যাপ্ত অতিরিক্ত সিপিইউ সময় সরবরাহ করে!

এটি অর্জনের জন্য আরও কয়েকটি পদ্ধতি রয়েছে এবং উপরে বর্ণিত পদ্ধতির আরডুইনোর জন্য ইতিমধ্যে একটি প্রয়োগ রয়েছে বলে মনে হচ্ছে ।


2
স্পিকার নিজেই যত দ্রুত গতি সঞ্চার না করেই আপনি পিডব্লিউএম মসৃণ করতে স্পিকারের আগে আপনি একটি ফিল্টার ব্যবহার করতে পারেন।
এন্ডোলিথ


1

এক মুহুর্তের জন্য সাউন্ড এ খেলুন, সম্ভবত 50 এমএস এর পরে বি শব্দ করুন এবং পিছনে পিছনে স্যুইচ করুন। কানটি যতটা বলতে পারে তার থেকে দ্রুত স্যুইচ করা ধারণাটি এবং এটি একই সাথে উভয় খেলার মতো শোনাবে।


1

আমি বিশ্বাস করি আরডুইনোর জন্য একটি টোন লাইব্রেরি রয়েছে যা দুটি টোন করে। আপনি যে AVR চিপটি ব্যবহার করছেন তা কোডটি মানিয়ে নিতে সক্ষম হওয়া উচিত should আরডুইনো.সি.সি-তে বেশ কয়েকটি দুর্দান্ত তরঙ্গরূপ উত্পাদনের থ্রেড রয়েছে

আপনি যদি কোনও ডিএসি যুক্ত করার সিদ্ধান্ত নেন তবে আমার কাছে একটি http://wiblocks.luciani.org/docs/app-notes/nb1a-nco.html চারটি স্বতন্ত্র আউটপুট চ্যানেলের একটি সংখ্যাসূচকভাবে নিয়ন্ত্রিত দোলক উদাহরণ রয়েছে । কোয়াড ডিএসি এবং রেফারেন্সটি কেবল প্রায় 2 ডলার বা তার বেশি।


0

একই সাথে 2 টি টিউন খেলার জন্য আমার কোডটি এখানে । দুঃখিত, অ্যাক্সেস পেতে আপনাকে এভিআর ফ্রিক্সে নিবন্ধন করতে হবে।


4
আপনি যদি কোডটি এখানে পোস্ট করেন বা অন্য কোথাও আমার একাউন্টের প্রয়োজন না হয় আমি আপনাকে একটি উক্তি দিতে চাই ...
টবি জাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.