তাত্পর্যপূর্ণ ADSR খামের জন্য সমীকরণগুলিতে সহায়তা করুন


11

অ্যাপ্লিকেশন কোড সহ, আমি একটি দোলকের আউটপুটটির প্রশস্ততা তৈরি করার জন্য একটি লিনিয়ার এডিএসআর খাম প্রয়োগ করেছি। আক্রমণ, ক্ষয় এবং মুক্তির সময়কালের পাশাপাশি টেকসই স্তরের জন্য প্যারামিটারগুলি খামে সেট করা যেতে পারে এবং সবকিছু প্রত্যাশা অনুযায়ী কাজ করে।

যাইহোক, আমি খামের র‌্যাম্প আকারগুলিকে এমন কিছুতে টুইঙ্ক করতে চাই যা সর্বাধিক সংশ্লেষকরা আরও প্রাকৃতিক প্রতিক্রিয়ার জন্য যা ব্যবহার করে তার সাদৃশ্যপূর্ণ: ক্ষয় এবং মুক্তির জন্য আক্রমণটির বিপরীতমুখী এবং ক্ষতিকারক on এই ধরণের র‌্যাম্প আকারগুলির জন্য খামের আউটপুট মানগুলি গণনা করার জন্য আমার সূত্রগুলি সঠিক পেতে আমার সমস্যা হচ্ছে। লিনিয়ার র‌্যাম্পগুলি গণনা করতে, আমি দ্বি-পয়েন্ট ফর্মটি ব্যবহার করছি, আক্রমণ / ক্ষয় / টেকসই / রিলিজ ইনপুট প্যারামিটার মানগুলি থেকে প্রাপ্ত স্টার্ট / শেষ / মানগুলিতে প্লাগিং করছি। আমি একই সূচনা / শেষ / পয়েন্ট মানগুলি ব্যবহার করে এক্সফোনেনশিয়াল (স্ট্যান্ডার্ড এবং বিপরীত) র‌্যাম্পগুলির সঠিক সূত্রটি কাজ করতে পারি না ।xyxy

আমি একটি ডেসমস গ্রাফিং ক্যালকুলেটর সেশনটি সংরক্ষণ করেছি যা আমি উপরে বর্ণিত রৈখিক র‌্যাম্পগুলির পদ্ধতির প্রদর্শন করে।

যদি কেউ আমাকে সঠিক দিকে নির্দেশ করতে সহায়তা করতে পারে তবে এটি অনেক প্রশংসা হবে।

উত্তর:


10

আমি মনে করি যে আপনাকে কী বিভ্রান্ত করছে তা হ'ল হ্রাসকারী ঘনিষ্ঠ ( ) কখনই 0-তে পৌঁছায় না, সুতরাং সত্যিকারের ঘনিষ্ঠ অংশগুলির সাথে একটি এডিএসআর জেনারেটর আটকে থাকবে; কারণ এটি কখনই লক্ষ্য মান পৌঁছাতে পারে না। উদাহরণস্বরূপ, যদি জেনারেটর আক্রমণ পর্বের উচ্চতায় থাকে (বলুন ) এবং এ টিকিয়ে রাখার মানটিতে পৌঁছাতে হয় , তবে এটি সত্যিকারের তাত্পর্য সহকারে যেতে পারে না, কারণ সত্যিকারের ক্ষতিকারকটি জিতেছে ' টি ক্ষয় হয় 0.5, এটি কেবল asympototically 0.5 যেতে হবে! y = 1 y = 0.5exy=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

আমি আমার লিনিয়ার স্কেল / দ্বি-পয়েন্ট সমীকরণ y = ((y2 - y1) / (x2 - x1)) * (x - x1) + y1 এর সাথে x সমস্যাটি স্থির করে পুনরায় লেখার মাধ্যমে সমস্যার সমাধান করেছি বলে মনে হয়েছে ^ x থেকে y = ((y2 - y1) / (e ^ x2 - e ^ x1)) * (e ^ x - e ^ x1) + y1। লিঙ্কে আমার ক্যালকুলেটর সেশন এই পদ্ধতির চিত্রিত করে। তাদের সম্পর্কে কি আমার সম্পর্কে সচেতন হওয়া উচিত? ফলাফলগুলি আমার কাছে সঠিক বলে মনে হচ্ছে।
গ্যারি ডিরিজ

এটি অন্যান্য সংশ্লেষকগুলিতে পাওয়া খামের আকার নয়। শুরু এবং শেষ স্তরটির সময় / আপেক্ষিক অবস্থানের উপর নির্ভর করে এটি খুব লিনিয়ার হয়ে উঠতে পারে।
পিচনেটগুলি

@ পিচনেটস, আপনি কি সেই স্ক্রিপ্টটি পেস্ট করতে ইচ্ছুক হতে পারেন যা এই খামগুলি তৈরি করেছিল?
পি আই

3

এটি বেশ পুরানো প্রশ্ন, তবে আমি কেবল পিচনেটসের উত্তরের একটি পয়েন্ট হাইলাইট করতে চাই:

উদাহরণস্বরূপ আপনি 2% সেকেন্ডে 0.8 থেকে 0.2 অবধি একটি খাম চান [...] এটি দুটি ধাপে বিভক্ত করুন: একটি র‌্যাম্প যা 2 সেকেন্ডে 0 থেকে 1.0 পর্যন্ত যায়; এবং তারপরে একটি রৈখিক রূপান্তর প্রয়োগ করুন যা মানচিত্র 0 থেকে 0.8 এবং 1.0 থেকে 0.2 হয়।

এই প্রক্রিয়াটি কখনও কখনও "ইজিং" হিসাবে পরিচিত হয় এবং এর মতো দেখায়

g(x,l,u)=f(xlul)(ul)+l

যেখানে এবং হ'ল নিম্ন এবং উপরের আবদ্ধ (সম্ভাব্য মানগুলি , , এবং বজায় রাখার স্তর) এবং মতো কিছু । নোট করুন যে আক্রমণ পর্বে আপনার এটির দরকার নেই কারণ এটি ইতিমধ্যে থেকে ।u 0 1 f ( x ) x n 0 1lu01f(x)xn01

এই পদ্ধতির ব্যবহারের জন্য আপডেট করা হয়েছে এখানে আসল দেশসোস সেশন। আমি এখানে একটি ঘনক্ষেত্র আকার ব্যবহার করেছি, তবে আপনি * আপনার পছন্দমতো আকারটি ব্যবহার করতে পারবেন, যতক্ষণ না শূন্য থেকে একের মধ্যে প্রদত্ত ইনপুটগুলিতে শূন্য থেকে আউটপুট উত্পাদন করে।f(x)

* আমি অনুমান করি যে ওপি সম্ভবত খুব দীর্ঘ সময় চলে গেছে তবে সম্ভবত এটি অন্য কাউকে সহায়তা করে।


এর জন্য আপনাকে ধন্যবাদ, আমি একজন ডিএডাব্লুএর জন্য আমি একটি বিকাশকারী জন্য একটি নমুনা প্রোগ্রামিং করছিলাম এবং ডেসমাস সেশনে প্রদত্ত সূত্রগুলি প্লাগ করেছিলাম এবং তারা নিখুঁতভাবে কাজ করেছিল। লম্বা লিনিয়ার খাম আর নেই! :)
ডগলাস

1

পিচনেটেসের মন্তব্য সম্পর্কে, "আক্রমণের পর্যায়ে ক্যাপাসিটরকে + 15 ভি ধাপে চার্জ করা হয়, তবে + 10 ভি এর একটি প্রান্ত পৌঁছে গেলে আক্রমণ স্টেজ শেষ হয়। এটি একটি নকশা পছন্দ, যদিও 2/3" জাদু নম্বর "অনেকগুলি ক্লাসিক খামের জেনারেটরে পাওয়া যায় এবং এটি সম্ভবত সংগীতজ্ঞদের সাথে পরিচিত" ":

10v টার্গেট সহ 15v অ্যাসিম্পোটের জন্য যে কোনও খাম শুটিং করছে তা কার্যতঃ একটি রৈখিক আক্রমণ তৈরি করে। এটি কেবলমাত্র 15 ভি সর্বাধিক এ্যাসিপটোট সহজেই উপলব্ধ এবং এটি লিনিয়ারের কাছে যথেষ্ট কাছে। এটি, এটি সম্পর্কে "যাদু" কিছুই নেই — তারা কেবল তারা পেতে পারে হিসাবে লিনিয়ার সন্ধান করে for

আমি জানি না যে কতগুলি ক্লাসিক সিন্থস 15v ব্যবহার করে — আমি সন্দেহ করি যে প্রায়শই একটি ডায়োড ড্রপ বা দুটি থাকে। আমার পুরানো মেষ মডিউলার একটি 10v খামের জন্য 13v ব্যবহার করে এবং আমি সবেমাত্র একটি কার্টিস এডিএসআর চিপটি দেখলাম যা সমানভাবে 5v খামের জন্য 6.5v ব্যবহার করে।


1

এই কোডটি পিচনেটগুলির অনুরূপ প্লট উত্পন্ন করা উচিত:

def ASD_envelope( nSamps, tAttack, tRelease, susPlateau, kA, kS, kD ):
    # number of samples for each stage
    sA = int( nSamps * tAttack )
    sD = int( nSamps * (1.-tRelease) )
    sS = nSamps - sA - sD

    # 0 to 1 over N samples, weighted with w
    def weighted_exp( N, w ):
        t = np.linspace( 0, 1, N )
        E = np.exp( w * t ) - 1
        E /= max(E)
        return E

    A = weighted_exp( sA, kA )
    S = weighted_exp( sS, kS )
    D = weighted_exp( sD, kD )

    A = A[::-1]
    A = 1.-A

    S = S[::-1]
    S *= 1-susPlateau
    S += susPlateau

    D = D[::-1]
    D *= susPlateau

    env = np.concatenate( [A,S,D] )

    # plot
    tEnv = np.linspace( 0, nSamps, len(env) )
    plt.plot( tEnv, env )
    plt.savefig( "OUT/EnvASD.png" )
    plt.close()

    return env

আমি যে কোনও উন্নতির জন্য কৃতজ্ঞ, একটি জিনিস যা ভাল ধারণা হতে পারে তা সর্বশেষ তিনটি পরামিতি (যা তিনটি স্তরের প্রতিটিের খাড়াতা নির্ধারণ করে) 0 এবং 1 এর মধ্যে পরিবর্তিত হতে পারে, যেখানে 0.5 একটি সরলরেখা হবে। তবে আমি কীভাবে এটি করব তা অফাহন্ডে দেখতে পাচ্ছি না।

এছাড়াও আমি সমস্ত ব্যবহারের কেসগুলি ভালভাবে পরীক্ষা করে দেখিনি, উদাহরণস্বরূপ যদি এক পর্যায়ে শূন্য দৈর্ঘ্য হয়।

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