আরটিটিওয়াই 45.45 বাউডের ক্ষেত্রে, আপনার কাছে এমন চিহ্নও থাকবে যা কোনও সংখ্যার নমুনা নয়, সুতরাং আপনাকে এমন একটি ফাংশন প্রয়োজন যা প্রতিটি নমুনা বলা যেতে পারে এবং তার প্রতীকটি শেষ হওয়ার পরে তার প্রত্যাবর্তনের মানটিতে সংকেত দেওয়া উচিত। এবং আপনার একটি পর্যায়ে সঞ্চয়ের প্রয়োজন, যা সাইন ওয়েভের পর্বটি যেখানে চলছে তার চলমান ট্যালি রাখে।
প্রতীক পাঠাতে যার দৈর্ঘ্য নমুনা হারের পূর্ণসংখ্য একক নয়, আপনার এই ক্রিয়াকলাপটি প্রয়োজন ...
int millisecondTimer(double milliseconds, double samplerate, int resettime)
{
static int fracsample=0;
static int counter=0;
static int retvalue=0;
static int first=1;
static double oldmilliseconds=1.0;
static int whole_samples=0;
static int samerror=32768;
if(resettime==1)
{
samerror=0;
counter=0;
retvalue=1;
first=1;
}
if(first==1 || milliseconds !=oldmilliseconds)
{
double samplesneeded=1;
double wholesamples=0;
samplesneeded=(samplerate) * (milliseconds /1000.0);
samerror=(modf(samplesneeded, &wholesamples)) * 32768.0;
whole_samples=wholesamples;
first=0;
}
if(counter<=whole_samples)
{
retvalue=2;
counter++;
}
else
{
counter-=whole_samples;
retvalue=1;
fracsample+=samerror;
oldmilliseconds=milliseconds;
if(fracsample>=32768)
{
fracsample-=32768;
counter--;
}
}
return retvalue;
}
এটি ব্যবহার করতে, সাইন ওয়েভের পরবর্তী নমুনা তৈরি করুন এবং এই ফাংশনটিতে কল করুন, তারপরে ফেরতের মান দুটির সমান নয় কিনা তা পরীক্ষা করুন। যদি এটি দুটি সমান না হয়, পরবর্তী প্রতীকটিতে এগিয়ে যান এবং সিদ্ধান্ত নেবেন যে আপনি কোনও স্থানের চিহ্ন পাঠাচ্ছেন কিনা, তবে কোডটির ব্লকের ভিতরে আবার এই ফাংশনটি কল করুন যা কার্যকর হবে যখন আপনি জানতে পেরেছেন যে রিটার্নের মান দুটি সমান নয়।
এবং রকবক্স ফার্মওয়্যার থেকে পর্বের সঞ্চালকটি এখানে রয়েছে প্রশস্ততার পরিবর্তনের অনুমতি দেওয়ার জন্য (পুরো ভলিউমটি 32767, 180 ডিগ্রি ফেজের পূর্ণ পরিমাণের -32768)।
signed short lerpsin(float frequency,signed short amplitude,unsigned long samplerate)
{
/* 128 sixteen bit sine samples + guard point */
static unsigned long phase=0;
unsigned int pos =0;
unsigned short frac=0;
static unsigned long step=0;
static float old_frequency=0;
signed short diff=0;
static const signed short sinetab[129] =
{
0, 1607, 3211, 4807, 6392, 7961, 9511, 11038,
12539, 14009, 15446, 16845, 18204, 19519, 20787, 22004,
23169, 24278, 25329, 26318, 27244, 28105, 28897, 29621,
30272, 30851, 31356, 31785, 32137, 32412, 32609, 32727,
32767, 32727, 32609, 32412, 32137, 31785, 31356, 30851,
30272, 29621, 28897, 28105, 27244, 26318, 25329, 24278,
23169, 22004, 20787, 19519, 18204, 16845, 15446, 14009,
12539, 11038, 9511, 7961, 6392, 4807, 3211, 1607,
0, -1607, -3211, -4807, -6392, -7961, -9511, -11038,
-12539, -14009, -15446, -16845, -18204, -19519, -20787, -22004,
-23169, -24278, -25329, -26318, -27244, -28105, -28897, -29621,
-30272, -30851, -31356, -31785, -32137, -32412, -32609, -32727,
-32767, -32727, -32609, -32412, -32137, -31785, -31356, -30851,
-30272, -29621, -28897, -28105, -27244, -26318, -25329, -24278,
-23169, -22004, -20787, -19519, -18204, -16845, -15446, -14009,
-12539, -11038, -9511, -7961, -6392, -4807, -3211, -1607,
0,
};
if(frequency!=old_frequency)
{
step = 0x100000000ull*frequency / samplerate;
}
phase+=step;
pos = phase >> 25;
frac = (phase & 0x01ffffff) >> 9;
diff = sinetab[pos + 1] - sinetab[pos];
old_frequency=frequency;
return ((-((sinetab[pos] + (frac*diff >> 16)))) * amplitude) >> 15;
}