আমি মনে করি যে আপনাকে কী বিভ্রান্ত করছে তা হ'ল হ্রাসকারী ঘনিষ্ঠ ( ) কখনই 0-তে পৌঁছায় না, সুতরাং সত্যিকারের ঘনিষ্ঠ অংশগুলির সাথে একটি এডিএসআর জেনারেটর আটকে থাকবে; কারণ এটি কখনই লক্ষ্য মান পৌঁছাতে পারে না। উদাহরণস্বরূপ, যদি জেনারেটর আক্রমণ পর্বের উচ্চতায় থাকে (বলুন ) এবং এ টিকিয়ে রাখার মানটিতে পৌঁছাতে হয় , তবে এটি সত্যিকারের তাত্পর্য সহকারে যেতে পারে না, কারণ সত্যিকারের ক্ষতিকারকটি জিতেছে ' টি ক্ষয় হয় 0.5, এটি কেবল asympototically 0.5 যেতে হবে! y = 1 y = 0.5e−xy=1y=0.5
যদি আপনি কোনও এনালগ খামের জেনারেটরটি দেখে থাকেন (উদাহরণস্বরূপ, 7555 ভিত্তিক সার্কিট প্রত্যেকে ব্যবহার করছেন বলে মনে করেন ), আপনি দেখতে পারেন যে আক্রমণ পর্বের সময়, যখন ক্যাপাসিটার চার্জ করা হয়, এটি প্রান্তটি নির্দেশ করার জন্য ব্যবহৃত চৌম্বকটির চেয়ে "উচ্চতর লক্ষ্যমাত্রা" করে থাকে আক্রমণ পর্বের। একটি (7) 555 ভিত্তিক সার্কিট + 15 ভি দ্বারা চালিত, আক্রমণের পর্যায়ে, ক্যাপাসিটারটিকে একটি + 15 ভি ধাপে চার্জ করা হয়, তবে +10 ভি এর একটি চৌম্বক পৌঁছে গেলে আক্রমণ পর্যায়টি শেষ হয়। এটি একটি নকশার পছন্দ, যদিও 2/3 হ'ল "ম্যাজিক নম্বর "টি অনেকগুলি ক্লাসিক খামের জেনারেটরে পাওয়া যায় এবং এটি সম্ভবত সংগীতজ্ঞদের সাথে পরিচিত।
সুতরাং, আপনি যে ফাংশনগুলির সাথে ডিল করতে চাইতে পারেন তা এক্সপেনশনিয়াল নয়, তবে এর সংস্করণগুলি স্থানান্তরিত / ছাঁটাই / আঁশযুক্ত সংস্করণ এবং আপনি কীভাবে "স্কোয়াশেড" হতে চান সে সম্পর্কে আপনাকে কিছু পছন্দ করতে হবে।
আপনি কেন এই জাতীয় সূত্রগুলি পাওয়ার চেষ্টা করছেন তা আমি জানতে আগ্রহী - সম্ভবত এটি সংশ্লেষণের জন্য আপনি যে সরঞ্জামটি ব্যবহার করছেন তার সীমাবদ্ধতার কারণেই; তবে আপনি যদি খামের প্রতিটি নমুনার জন্য কিছু কোড চলমান একটি সাধারণ উদ্দেশ্যে প্রোগ্রামিং ল্যাঙ্গুয়েজ (সি, জাভা, পাইথন) ব্যবহার করে এবং "রাষ্ট্র" এর ধারণা ব্যবহার করেন তবে তা পড়ুন ... কারণ এটি সর্বদা সহজ "এই জাতীয় বিভাগটি সবেমাত্র 0 এ পৌঁছেছে যে কোনও মান থেকে চলে যাবে" এর মতো বিষয়গুলি প্রকাশ করুন।
খামগুলি প্রয়োগের বিষয়ে আমার পরামর্শের দুটি অংশ।
প্রথমটি হয় নাসমস্ত slালু / বৃদ্ধিগুলি স্কেল করার চেষ্টা করা যাতে খামটি ঠিক শুরু এবং শেষের মানগুলিতে পৌঁছায়। উদাহরণস্বরূপ আপনি 2% সেকেন্ডে 0.8 থেকে 0.2 পর্যন্ত চলে এমন একটি খাম চান, যাতে আপনি -0.3 / সেকেন্ডের ইনক্রিমেন্ট গণনা করতে প্ররোচিত হতে পারেন। এটা করবেন না। পরিবর্তে, এটি দুটি ধাপে বিভক্ত করুন: 2 সেকেন্ডে 0 থেকে 1.0 পর্যন্ত র্যাম্প পাওয়া; এবং তারপরে একটি রৈখিক রূপান্তর প্রয়োগ করুন যা মানচিত্র 0 থেকে 0.8 এবং 1.0 থেকে 0.2 হয়। এইভাবে কাজ করার জন্য দুটি সুবিধা রয়েছে - প্রথমটি হ'ল খামের সময় 0 থেকে 1 এর মধ্যে খামের তুলনায় আপনার যে কোনও গণনা সহজ হয়; দ্বিতীয়টি হ'ল যদি আপনি খামের পরামিতিগুলি (ইনক্রিমেন্ট এবং শুরু / শেষ সময়) মাঝের রাস্তা পরিবর্তন করেন তবে সবকিছু ভালভাবে আচরণ করবে। আপনি যদি একটি সিন্থে কাজ করছেন তবে ভাল, যেহেতু লোকেরা সংশোধনের গন্তব্য হিসাবে খামের সময় পরামিতিগুলি জিজ্ঞাসা করবে।
দ্বিতীয়টি হ'ল খামের আকারগুলির সাথে প্রাক-গণিত লুকিং টেবিলটি ব্যবহার করা। এটি গণনার দিক থেকে হালকা, এটি অনেকগুলি নোংরা বিবরণ বের করে (উদাহরণস্বরূপ আপনাকে কোনও ঘনিষ্ঠভাবে 0 পৌঁছানোর সাথে বিরক্ত করতে হবে না - এটি আপনার দমকাটে ছাঁটাই এবং পুনরুদ্ধার করুন যাতে এটি ম্যাপ করা হয় [0, 1]), এবং প্রতিটি পর্যায়ে খামের আকারগুলি পরিবর্তনের বিকল্প সরবরাহ করা সহজ মৃত।
আমি বর্ণিত পদ্ধতির জন্য সিউডো কোডটি এখানে।
render:
counter += increment[stage]
if counter > 1.0:
stage = stage + 1
start_value = value
counter = 0
position = interpolated_lookup(envelope_shape[stage], counter)
value = start_value + (target_level[stage] - start_value) * position
trigger(state):
if state = ON:
stage = ATTACK
value = 0 # for mono-style envelopes that are reset to 0 on new notes
counter = 0
else:
counter = 0
stage = RELEASE
initialization:
target_level[ATTACK] = 1.0
target_level[RELEASE] = 0.0
target_level[END_OF_RELEASE] = 0.0
increment[SUSTAIN] = 0.0
increment[END_OF_RELEASE] = 0.0
configuration:
increment[ATTACK] = ...
increment[DECAY] = ...
target_level[DECAY] = target_level[SUSTAIN] = ...
increment[RELEASE] = ...
envelope_shape[ATTACK] = lookup_table_exponential
envelope_shape[DECAY] = lookup_table_exponential
envelope_shape[RELEASE] = lookup_table_exponential