ã¿ãªããããã«ã¡ã¯ïŒ CïŒã§ã®VSTã·ã³ã»ãµã€ã¶ãŒã®äœæã«é¢ããèšäºã®ç¬¬4éšãèªã¿ãŸãã åã®ããŒãã§ã¯ãä¿¡å·ãçæããæ¯å¹
ãšã³ãããŒããšåšæ³¢æ°ãã£ã«ã¿ãŒãé©çšããŸããã
ä»åã¯ãã£ã¹ããŒã·ã§ã³ã®å¹æãèŠãŠãããŸã-ãšã¬ãã®ã¿ãªã¹ãããã£ã¬ã€ã«éŠŽæã¿ã®ããä¿¡å·ã®æªã¿ïŒãšã³ãŒã§ããããŸãïŒã
ã·ã³ã»ãµã€ã¶ãŒã³ã³ããŒãã³ãïŒãžã§ãã¬ãŒã¿ãŒããã£ã«ã¿ãŒããšãã§ã¯ãïŒã®ãã©ã¡ãŒã¿ãŒã®å€ãæéå
ã«å€æŽïŒå€èª¿ïŒããããšã§ãããŸããŸãªè峿·±ããµãŠã³ããåŸãããšãã§ããŸãã ãããè¡ãæ¹æ³ã®ãªãã·ã§ã³ãæ€èšããŠãã ããã
ç§ã®ã·ã³ã»ãµã€ã¶ãŒã®ãœãŒã¹ã³ãŒãã¯GitHubã§å
¥æã§ããŸã ã
VST GClipãã©ã°ã€ã³ã®ã¹ã¯ãªãŒã³ã·ã§ãã
èšäºã®ãµã€ã¯ã«
- CïŒWPFã§VSTiã·ã³ã»ãµã€ã¶ãŒãçè§£ããŠèšè¿°ããŸã
- ADSRä¿¡å·ãšã³ãããŒã
- ãã¿ã¯ãŒã¹åšæ³¢æ°ãã£ã«ã¿ãŒ
- é
å»¶ãæªã¿ãããã³ãã©ã¡ãŒã¿ãŒå€èª¿
ç®æ¬¡
- ã¯ãªããã³ã°ãæªã¿ããªãŒããŒãã©ã€ããæªã¿
- ã³ãã£ã å¹æã®æªã¿
- ãã£ã¬ã€ãšãªããŒã
- ã³ãŒãé
延广
- ãã©ã¡ãŒã¿å€èª¿
- LFOã¯ã©ã¹ã®äœæ
- IParameterModifierã€ã³ã¿ãŒãã§ã€ã¹ãšçŸåšã®ãã©ã¡ãŒã¿ãŒå€ã®äœ¿çš
- ãããã«
- åç
§è³æ
ã¯ãªããã³ã°ãæªã¿ããªãŒããŒãã©ã€ããæªã¿
ã®ã¿ãŒã¢ã³ããšããã¯ã¢ããã®åæã¢ãã«ã¯ããããã·ã³ãã«ã§äœå質ã§ãããåŠçãããä¿¡å·ã«æªã¿ãå ããŠããŸããã ã¢ããã°ã¢ã³ãã䜿çšããå Žåãä¿¡å·ã®çºä¿¡é³éã«å¿ããŠä¿¡å·ãæªãã§ããŸããã ä¿¡å·æ¯å¹
ãå¢å ãããšãéç·åœ¢æªã¿ã®ä¿æ°ãå¢å ããããŸããŸãªé«èª¿æ³¢ã远å ãããŸãã å®¶åºçšã¹ããŒã«ãŒãæå€§éã«ãªã³ã«ãããšãæªã¿ãèãããã¯ãã§ãã
51幎ç®ã«ãKings of Rhythmã®ã®ã¿ãªã¹ããéäžã§æå·ããã¢ã³ãã䜿çšãããããã¥ãŒãµãŒããã®ãµãŠã³ããæ°ã«å
¥ã£ããšãã話ããããŸãã
å¹æãæªã¿ã-è±èªãããæªã¿ããšããŠç¿»èš³ããŸãã ä¿¡å·ã®æ¯å¹
ãå³å¯ã«å¶éããå§ãããšãéç·åœ¢æªã¿ãäœæãããæ°ããé«èª¿æ³¢ã衚瀺ãããŸãã å¶éïŒãããå€ïŒã倧ããã»ã©ãä¿¡å·ã¯ããæªã¿ãŸãã
ãããã¯ããšããèšèãå«ãŸãããžã£ã³ã«ã®ã»ãšãã©ãã¹ãŠã®ã®ã¿ãŒã¯ããã£ã¹ããŒã·ã§ã³ãšãã§ã¯ããŸãã¯ãªãŒããŒãã©ã€ãã«ãã£ãŠåŠçãããŸãã æåãªãšãã§ã¯ãã®é³å£°ãµã³ãã«ãžã®ãªã³ã¯ ã
ãªãŒããŒãã©ã€ãã«ã¯ãæªã¿ãããæ»ãããªæ¯å¹
å¶éããããŸãã ãªãŒããŒãã©ã€ãã¯ããœããã¯ãªããã³ã°ãšãåŒã°ããããŒãã¯ãªããã³ã°ãšãåŒã°ããŸãã ã®ã¿ãŒã®ãªãŒããŒãã©ã€ãã¯ãã€ã³ãã£ãŒããã¯ããããããã¯ãªã©ãããç©ãããªãžã£ã³ã«ã§äœ¿çšãããŠããŸãã
æªã¿ïŒããŒãã¯ãªããã³ã°ïŒãšãªãŒããŒãã©ã€ãïŒãœããã¯ãªããã³ã°ïŒã®å¹æã®ããããã®æ¯èŒ
ã¯ãªããã³ã°ãšã¯ã0 dBã®ããžã¿ã«æ¯å¹
ãè¶
ããå Žåã®äžèŠãªã¢ãŒãã£ãã¡ã¯ãïŒã¯ãªãã¯ïŒãæããŸãã ãã¯ãªãŒã³ãïŒã¢ããã°ããã«ãããªã¢ã³ãããšãã¥ã¬ãŒãããã«ïŒæªã¿ä¿¡å·ãå®çŸãããšãã§ã¯ãããããŸãã ããšãã°ã GClipãã©ã°ã€ã³ïŒèšäºã®åé ã®ç»é¢ã ãïŒã¯ãçä¿¡ä¿¡å·ãæ°åŠçã«åçŽã«ã«ããããŸãã
ã³ãã£ã å¹æã®æªã¿
äžèšãããæ¬è³ªçã«ãããŒããã£ã¹ããŒã·ã§ã³ã¯æå€§çµ¶å¯Ÿæ¯å¹
å€ã®ãã©ã¡ãŒã¿ãŒ-ãããå€ã«ãã£ãŠã®ã¿æ±ºå®ããããšçµè«ä»ããããŸãã ãµã³ãã«ã®çµ¶å¯Ÿå€ã¯1ãè¶
ããŸãããã€ãŸãããããå€ãéé[0,1]ã«ãããŸãã
ä¿¡å·ãå¶éããã»ã©ïŒãããå€ããŒãã«è¿ã¥ããïŒãããªã¥ãŒã ã匱ããªããŸãã ä¿¡å·ã®ããªã¥ãŒã ãå€ãããªãããã«ãå
ã«æ»ãããšãã§ããŸãããµã³ãã«ã®å€ããããå€ã§é€ç®ããŸãã
ããŒããã£ã¹ããŒã·ã§ã³ã®ç°¡åãªã¢ã«ãŽãªãºã ãååŸããŸããããã¯åãµã³ãã«ã«åå¥ã«äœ¿çšãããŸãã
- ãµã³ãã«å€ããããå€ãã倧ããå Žåã¯ããããå€ãšçããããŸãã
- ãµã³ãã«å€ã-Thresholdããå°ããå Žåã¯ã-Thresholdã«èšå®ããŸãã
- ãµã³ãã«ã®å€ã«ãããå€ãæããŸãã
ç§ãã¡ãæžããã·ã³ã»ãµã€ã¶ãŒã«æ»ããŸãïŒ æåã®èšäºã®ã¯ã©ã¹ã¢ãŒããã¯ãã£ã®ã¬ãã¥ãŒïŒã Distortionã¯ã©ã¹ã¯SyntageAudioProcessorComponentWithParameters <AudioProcessor>ã¯ã©ã¹ãç¶æ¿ããIProcessorã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããŸãã
Powerãã©ã¡ãŒã¿ãŒã远å ããŠããšãã§ã¯ãã®åäœæ¹æ³ã瀺ããŸãã Tresholdãã©ã¡ãŒã¿ãŒã0ã«ããããšã¯ã§ããŸãããããããªããšã0ã§é€ç®ããå¿
èŠããããŸããä¿¡å·ãå¶éããã«ã¯ããµã³ãã«å€ããæå€§å€ãåãããµã³ãã«å€ããŒããã倧ããå Žåã¯Tresholdã䜿çšããŸãã ãµã³ãã«å€ã®æå€§å€ãååŸãããµã³ãã«å€ããŒãããå°ããå Žåã¯-Tresholdã䜿çšããŸãã
public enum EPowerStatus { Off, On } public class Distortion : SyntageAudioProcessorComponentWithParameters<AudioProcessor>, IProcessor { public EnumParameter<EPowerStatus> Power { get; private set; } public RealParameter Treshold { get; private set; } public Distortion(AudioProcessor audioProcessor) : base(audioProcessor) { } public override IEnumerable<Parameter> CreateParameters(string parameterPrefix) { Power = new EnumParameter<EPowerStatus>(parameterPrefix + "Pwr", "Power", "", false); Treshold = new RealParameter(parameterPrefix + "Trshd", "Treshold", "Trshd", 0.1, 1, 0.01); return new List<Parameter> {Power, Treshold}; } public void Process(IAudioStream stream) { if (Power.Value == EPowerStatus.Off) return; var count = Processor.CurrentStreamLenght; for (int i = 0; i < count; ++i) { var treshold = Treshold.Value; stream.Channels[0].Samples[i] = DistortSample(stream.Channels[0].Samples[i], treshold); stream.Channels[1].Samples[i] = DistortSample(stream.Channels[1].Samples[i], treshold); } } private static double DistortSample(double sample, double treshold) { return ((sample > 0) ? Math.Min(sample, treshold) : Math.Max(sample, -treshold)) / treshold; } }
ãã£ã¬ã€ãšãªããŒã
é
å»¶ ãããã¯ãšã³ãŒã§ã-ä¿¡å·ãé
å»¶ãããŠç¹°ãè¿ã广ã§ãã éåžžãé
å»¶ã¯ãä¿¡å·ã®æç¢ºãªç¹°ãè¿ãïŒè€æ°ã®ç¹°ãè¿ãïŒãšããŠçè§£ãããŸãã ã¢ãŒãããã©ã³ãžã·ã§ã³ãå
¥åããŠãã ãã-çã倧ããªé³ãæ°ååå°ãããããªã¥ãŒã ã倱ãããæ¹æ³ãèãããŸãã ã³ã³ãµãŒãããŒã«ã«ç«ã€ãšãå®¶ã®ã¢ãŒããããã¯ããã«è€éãªå»ºç¯ç©ãšé³ãåå°ãã衚é¢ããããããæç¢ºãªç¹°ãè¿ãé³ã¯èãããªããªããŸãããã¹ã ãŒãºã«ãã§ãŒãããé³ãèãããŸãã
ãªããŒãã¯ãå€éåå°äžã«é³ã®åŒ·åºŠãåŸã
ã«æžããããã»ã¹ã§ãã 蚱容ãããæ®é¿æéã¯ãé³ã®ã¬ãã«ã60 dBæžå°ããæéã§ãã éšå±/ããŒã«ã®é
眮ã«å¿ããŠãæ®é¿æéãšé³åã¯éåžžã«ç°ãªãå ŽåããããŸãã
èãããšã¯ ãé³ã«ã€ããŠèªããããåžžã«åªããŠããŸãã ãããŠãããªãã¯èŠãããšãã§ããŸã ã
ç³ã¿èŸŒã¿ã«ãããªããŒã广ã®å®è£
ïŒ Convolution Reverb ïŒã«èšåãã䟡å€ããããŸãã èŠããã« ãå¿
èŠãªéšå±ãã説æãããç¹å¥ãªãã¡ã€ã«ïŒ ã€ã³ãã«ã¹å¿ç ïŒãæå
ã«ããããããã®éšå±ã®åžæããé³ãããªããŒããå®å
šã«æ£ç¢ºã«åçŸã§ããŸãã
ã€ã³ãã«ã¹å¿çïŒãããã¯åã«ã€ã³ãã«ã¹ãšåŒã°ãããããã¯ãŒã¯äžã§ã¯éåžžã«å€ããªããŸãïŒãåŸãã«ã¯ãç®çã®éšå±ã«ãã€ã¯ãèšçœ®ããé²é³ããªã³ã«ããŠãµãŠã³ããåçããå¿
èŠããããŸã-ãã€ã³ãã«ã¹ã-ããããããã«æãè¿ãçŸè±¡ïŒããã; å¢ãã®ãšã³ãŒãèšé²ããŸãã
éšå±ã®é³é¿ãå®å
šã«åçŸããæ¹æ³ããããŸãã-å°ãªããšãããã«ãããå€åããªãã€ã³ãã«ã¹æ©èœã§å€åããªããµãŠã³ããä¿èšŒãããŸãã ãã¹ãŠã®ããã»ã¹ãã©ã¡ãŒã¿ãã€ã³ãã«ã¹é¢æ°ã«ãã£ãŠæ±ºå®ãããããã§ã¯ãããŸãããã人ã«ãšã£ãŠæãéèŠãªãã©ã¡ãŒã¿ã¯ãŸã 決å®ãããŠããŸãã
ã®ã¿ãŒãã£ããããã®ã€ã³ãã«ã¹å¿ç㯠ãã³ã³ãã¥ãŒã¿ãŒã§ã®ã¿ãŒãåèªå°ããéã«äœ¿çšããããã«åæ§ã«è¡ãããŸãã
ã³ãŒãé
延广
ãšã³ãŒã¯ãããçšåºŠã®æéé
å»¶ã䌎ãä¿¡å·ã®ç¹°ãè¿ãã§ãã ã€ãŸããçŸåšã®ä¿¡å·å€ã¯ãçŸåšã®æ°ããå€ã«ä¿¡å·å€tãå ããæéãšããŠå ç®ãããŸããtã¯é
å»¶æéã§ãã
ãµã³ãã«å€ã®ç°¡åãªåŒïŒ
ããã§ãxã¯å
¥åãµã³ãã«ã·ãŒã±ã³ã¹ãyã¯çµæã®ã·ãŒã±ã³ã¹ãTã¯ãµã³ãã«ã®é
å»¶ã§ãã
æåŸã«èšç®ãããTåã®ãµã³ãã«ãä¿åããå¿
èŠããããŸãã æ¯åãé
å»¶ã®ãããµã³ãã«å€ãååŸããæ°ããèšç®å€ãä¿åããå¿
èŠããããŸãã 埪ç°ãããã¡ã¯ãããã®ç®çã«é©ããŠããŸãã
ã®ã¿ãŒããã«Ibanez AD9ã¢ããã°ãã£ã¬ã€
é
å»¶ã®ããªã¥ãŒã ïŒç§ã¯ãéããšèšããŸãïŒã調æŽããã«ã¯ãåŒã®ä¿æ°ã代çšã§ããŸãã éåžžããã©ã°ã€ã³ã¯ããã©ã€/ãŠã§ãããšããçšèªã䜿çšããŸã-æªåŠçïŒããã©ã€ãïŒä¿¡å·ãšåŠçæžã¿ïŒããŠã§ãããïŒä¿¡å·ã®æ··åæ¯ã§ãã åèšã§ãä¿æ°ã¯å°æ°ã衚ããã1ã«çãããªããŸãã ããã«ã®åçã§ã¯ãWetãã©ã¡ãŒã¿ãŒã¯Delay LevelãšåŒã°ããŠããŸãã
ãã®åŒã«ã¯ãšã³ãŒæžè¡°ã¯ãããŸãããåžžã«åãé³éã¬ãã«ã§ç¹°ãè¿ãããŸãã ãã®ãã©ã¡ãŒã¿ãŒã¯éåžžãã£ãŒãããã¯ãšåŒã°ãïŒåçã§ã¯ãã©ã¡ãŒã¿ãŒã¯ãªããŒããšåŒã°ããŸãïŒãæéã«å¿ããŠé³éãäžããŸãã
åçŽãªé
å»¶ã«ã¯4ã€ã®ãã©ã¡ãŒã¿ãŒããããŸãã
- æ¶è²»é»å-广ãåããã©ãã
- ãã©ã€ã¬ãã«
- æé-ç§åäœã®é
å»¶æé
- ãã£ãŒãããã¯
TïŒãµã³ãã«ã®é
å»¶ããµã³ãã«ãããã¡ãŒã®ãµã€ãºïŒãèŠã€ããã«ã¯ããµã³ããªã³ã°åšæ³¢æ°ã«Timeãã©ã¡ãŒã¿ãŒãæããå¿
èŠããããŸãã Timeãã©ã¡ãŒã¿ãŒã倿Žãããã³ã«ãããã¡ãŒã«ã¡ã¢ãªãå²ãåœãŠãªãããã«ãæå€§ââé·ã®Time.Max * SampleRateã®é
åãããã«äœæããŸãã
埪ç°ãããã¡ãŒã®ãã«ããŒã¯ã©ã¹ãäœæããŸãããã
class Buffer { private int _index; private readonly double[] _data; public Buffer(int length) { _data = new double[length]; _index = 0; } public double Current { get { return _data[_index]; } set { _data[_index] = value; } } public void Increment(int currentLength) { _index = (_index + 1) % currentLength; } public void Clear() { Array.Clear(_data, 0, _data.Length); } }
ãµã³ãã«èšç®ã®æ©èœïŒ
private double ProcessSample(double sample, Buffer buffer) { var dry = DryLevel.Value; var wet = 1 - dry; var output = dry * sample + wet * buffer.Current; buffer.Current = sample + Feedback.Value * buffer.Current; int length = (int)(Time.Value * Processor.SampleRate); buffer.Increment(length); return output; }
ã¯ã©ã¹ã³ãŒãé
å»¶ public class Delay : SyntageAudioProcessorComponentWithParameters<AudioProcessor>, IProcessor { private class Buffer { private int _index; private readonly double[] _data; public Buffer(int length) { _data = new double[length]; _index = 0; } public double Current { get { return _data[_index]; } set { _data[_index] = value; } } public void Increment(int currentLength) { _index = (_index + 1) % currentLength; } public void Clear() { Array.Clear(_data, 0, _data.Length); } } private Buffer _lbuffer; private Buffer _rbuffer; public EnumParameter<EPowerStatus> Power { get; private set; } public RealParameter DryLevel { get; private set; } public RealParameter Time { get; private set; } public RealParameter Feedback { get; private set; } public Delay(AudioProcessor audioProcessor) : base(audioProcessor) { audioProcessor.OnSampleRateChanged += OnSampleRateChanged; audioProcessor.PluginController.ParametersManager.OnProgramChange += ParametersManagerOnProgramChange; } public override IEnumerable<Parameter> CreateParameters(string parameterPrefix) { Power = new EnumParameter<EPowerStatus>(parameterPrefix + "Pwr", "Power", "", false); DryLevel = new RealParameter(parameterPrefix + "Dry", "Dry Level", "Dry", 0, 1, 0.01); Time = new RealParameter(parameterPrefix + "Sec", "Delay Time", "Time", 0, 5, 0.01); Feedback = new RealParameter(parameterPrefix + "Fbck", "Feedback", "Feedback", 0, 1, 0.01); return new List<Parameter> {Power, DryLevel, Time, Feedback}; } public void ClearBuffer() { _rbuffer?.Clear(); _lbuffer?.Clear(); } public void Process(IAudioStream stream) { if (Power.Value == EPowerStatus.Off) return; var leftChannel = stream.Channels[0]; var rightChannel = stream.Channels[1]; var count = Processor.CurrentStreamLenght; for (int i = 0; i < count; ++i) { leftChannel.Samples[i] = ProcessSample(leftChannel.Samples[i], i, _lbuffer); rightChannel.Samples[i] = ProcessSample(rightChannel.Samples[i], i, _rbuffer); } } private void OnSampleRateChanged(object sender, SyntageAudioProcessor.SampleRateEventArgs e) { var size = (int)(e.SampleRate * Time.Max); _lbuffer = new Buffer(size); _rbuffer = new Buffer(size); } private void ParametersManagerOnProgramChange(object sender, ParametersManager.ProgramChangeEventArgs e) { ClearBuffer(); } private double ProcessSample(double sample, int sampleNumber, Buffer buffer) { var dry = DryLevel.Value; var wet = 1 - dry; var output = dry * sample + wet * buffer.Current; buffer.Current = sample + Feedback.ProcessedValue(sampleNumber) * buffer.Current; int length = (int)(Time.ProcessedValue(sampleNumber) * Processor.SampleRate); buffer.Increment(length); return output; } }
ãã©ã¡ãŒã¿å€èª¿
ãã®æ®µéã§ã¯ããµãŠã³ããçæããããã®æ¬¡ã®ãã§ãŒã³ãã¬ãã¥ãŒããã³ã³ãŒãã£ã³ã°ãããŠããŸãïŒããã¯ãã¹ãŠã以åã®èšäºã§ç¢ºèªã§ããŸãïŒã
- çºæ¯åšã®åçŽãªæ³¢ã®çæ
- ADSRãšã³ãããŒãä¿¡å·åŠç
- åšæ³¢æ°ãã£ã«ã¿ãŒã«ããä¿¡å·åŠç
- ãããªããšãã§ã¯ãåŠçïŒååžãé
å»¶
ãšãã§ã¯ãã®åŸãä¿¡å·ã¯éåžžãã¹ã¿ãŒåŠçãçµãŠïŒéåžžã¯çµæã®é³éã調æŽããã ãã§ïŒãã©ã°ã€ã³åºåã«éãããŸãã
ãã®ãããªã·ãŒã±ã³ã¹ã䜿çšãããšããã§ã«ããŸããŸãªãµãŠã³ããååŸã§ããŸãã
å€ãã®é³ã¯ãæéå
ã«ãã©ã¡ãŒã¿ãŒã倿Žããããšã«ãã£ãŠäœæãããŸãã ããšãã°ããã¬ãŒã¶ãŒãã¹ãã«ãã·ã§ããã®é³ã§ã¯ ãã¡ã€ã³åšæ³¢æ°ãé«ããäœã«ã©ã®ããã«å€åããããã¯ã£ãããšèãããšãã§ããŸãã
çè«çã«ã¯ããã¹ãã¯ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒïŒParameterã¯ã©ã¹ïŒãç¥ã£ãŠããããããã¯ã¢ãŒããã¯ãã£ãŒå
ã ãã§ãªãååšããŸãã ãã¹ãã¯ãã©ã¡ãŒã¿ã®èªååãè¡ã£ãŠãæéã®çµéãšãšãã«ãããã倿Žã§ããŸãã
FL Studio 12ã§ã®ãã©ã¡ãŒã¿ãŒã®èªåå
ãã¡ããããã®ãããªèªååã¯éåžžã«äŸ¿å©ã§ã鳿¥œãäœæãããšãã«éåžžã«é »ç¹ã«äœ¿çšãããŸãã ãããããã®ãããªèªååã¯ãã©ãã¯ã®åçæã«ã®ã¿æ©èœãããããèšå®ããã®ã¯å°é£ã§ãã é³ç¬ŠãæŒããããã³ã«ãã©ã¡ãŒã¿ãŒã倿Žãããå ŽåããŸãã¯äœããã®æ³åã«åŸã£ãŠçµ¶ãã倿Žãããå Žå ãã©ã°ã€ã³èªäœã«ãã§ã«èªååãè¡ãæ¹ãè«ççã§ã-ãµãŠã³ããäœæããããã®ç¯å²ãå¢ããŸãã
éåžžãã·ã³ã»ãµã€ã¶ãŒã«ã¯ããã©ã¡ãŒã¿ãŒã®å€èª¿ãæ
åœããç¹å¥ãªéšå/ãããã¯/ã¢ãžã¥ãŒã«ããããŸãã å€èª¿ãããã¯ãŸãã¯å€èª¿ãããªãã¯ã¹ãšåŒã°ããŸãã ãã©ã¡ãŒã¿ãŒã®å€èª¿ã¯ã èšäº2ã® ADSRãšã³ãããŒãã®æ¯å¹
ã®å€èª¿ã«äŒŒãŠããŸãã ãšã³ãããŒãã®ä»£ããã«ããã©ã¡ãŒã¿ãŒã倿Žããããã®æ³åãèãããã©ã°ã€ã³å
ã®ãã©ã¡ãŒã¿ãŒã調æŽã§ããããšãæ³åããŠãã ããïŒããã¯ã調æŽã§ããããšãæå³ããŸãïŒã
ãšã³ãããŒããšLFOã¯éåžžãæ³åããšèŠãªãããŸãïŒäœåšæ³¢æ°ãªã·ã¬ãŒã¿ãŒã¯åºæ¬çã«åããªã·ã¬ãŒã¿ãŒã§ããããã®ãµã³ãã«ã¯é³æ³¢ãšããŠã§ã¯ãªãå€èª¿ã®ä¹æ°ãšããŠäœ¿çšãããŸãïŒã å€ãã®ã·ã³ã»ãµã€ã¶ãŒã§ã¯ããã©ã¡ãŒã¿ãŒã®å€åã®ã°ã©ããæåã§æç»ããããäºåã«æºåããããã¿ãŒã³ããçµã¿ç«ãŠãããšãã§ããŸãã
Sylenth1ã·ã³ã»ãµã€ã¶ãŒã®å€èª¿ãããã¯ã 2ã€ã®ADSRãšã³ãããŒãã2ã€ã®LFOãžã§ãã¬ãŒã¿ãŒãããã³ä»ã®ãœãŒã¹ïŒããŒããã¬ã¹ã®ããã·ãã£ãªã©ïŒã«åºã¥ãå€èª¿ããããŸãã åãœãŒã¹ã«å¯ŸããŠã2ã€ã®å€èª¿ããããã©ã¡ãŒã¿ãŒãšãå€èª¿åºŠããäžéå åãšããŠæå®ã§ããŸãïŒãã©ã¡ãŒã¿ãŒåã®å·ŠåŽã«ãã€ã¹ãïŒã
è¡æž
ã·ã³ã»ãµã€ã¶ãŒã®å€èª¿ãããªãã¯ã¹ã åè¡ã¯ã远å ã®èšå®ïŒå€èª¿ã®ã¿ã€ãããéãã®ä¹æ°ãæ²ç·ãªã©ïŒãæã€ããœãŒã¹-å€èª¿ãã©ã¡ãŒã¿ãŒãã®ãã¢ã瀺ããŠããŸãã
Massiveã·ã³ã»ãµã€ã¶ãŒã®ãšã³ãããŒããšLFOã åã
ã®ãã¿ãŒã³/ããŒã¹ããæåã§å€åæ²ç·ãæãããšãã§ããŸãã
LFOã¯ã©ã¹ã®äœæ
ã·ã³ã»ãµã€ã¶ãŒã®å€èª¿ãããã¯
LFOã¯ã©ã¹ãæžããŸãããããã®ã¿ã¹ã¯ã¯ãã©ã¡ãŒã¿ãŒãå€èª¿ããããšã§ãã ãªã·ã¬ãŒã¿ãŒã¯ãéé[-1,1]ã®æ¯å¹
ãæã€æ³¢ãçæããŸããããããã©ã¡ãŒã¿ãŒã®ä¿æ°ãšããŠäœ¿çšããŸãã LFOãªã·ã¬ãŒã¿ãŒã¯åºæ¬çã«ãåçŽãªæ³¢ãçæããããã«ãšã³ã³ãŒãããåŸæ¥ã®ãªã·ã¬ãŒã¿ãŒãšå€ãããŸããã æ¥é èŸãäœåšæ³¢ãã¯ãéåžžã«äœãåšæ³¢æ°ïŒãã«ãæªæºïŒãçæããå¯èœæ§ãããããã«èšè¿°ãããŠããŸãã 人ã¯20ãã«ã以äžã®é³ãèããªãã®ã§ã鳿¥œããŒããŒãïŒäž»çºæ¯åšïŒã«ã¯ãã®ãããªäœåšæ³¢æ°ã¯ãããŸããã
ãªã·ã¬ãŒã¿ãŒã«ã¯ã次ã®ãã©ã¡ãŒã¿ãŒããããŸãïŒåšæ³¢æ°ãããã³æ³¢ã®ã¿ã€ãïŒãµã€ã³ããã©ã€ã¢ã³ã°ã«ãã¹ã¯ãšã¢ããã€ãºïŒã
ãã®ãããªä¿¡å·ãç°¡åã«çæããããã«ãWaveGenerator.GenerateNextSample颿°ã¯ä»¥åã«äœæãããŸããã
ãµã³ãã«ã®å€ãã©ã®ããã«å€æŽããããæ€èšããŠãã ããã ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒïŒãã©ã¡ãŒã¿ãŒã¯ã©ã¹ïŒã«ã¯RealValueããããã£ããããéé[0ã1]ã®ãã©ã¡ãŒã¿ãŒå€ã衚瀺ããŸãã ãããå¿
èŠãªãã®ã§ãã ãªã·ã¬ãŒã¿ãŒã¯[-1,1]ã®ç¯å²ã®å€ãçæããŸãã å®éããã©ã¡ãŒã¿ãŒãããå³ã«æå€§ã«åããæ¬¡ã«å·Šã«æå€§ã«åããŸãã
åé¡ããããŸã-ãã©ã¡ãŒã¿ãŒå€ã0.25ã§ãããšããŸãããã ãã©ã¡ãŒã¿ãŒãäžäžã«åçã«å€æŽããã«ã¯ã0ãã0.5ã«ã®ã¿å€æŽã§ããŸãïŒ-1ã¯0ã«å¯Ÿå¿ãã1ã¯0ã§0.5ã«å¯Ÿå¿ããŸã-ãã©ã¡ãŒã¿ãŒã¯å€åããã0.25ã«çãããªããŸãïŒã ãããã£ãŠããã©ã¡ãŒã¿ãŒrã®å€ãåå²ããæå°ã®ã»ã°ã¡ã³ããåããŸãïŒf = minïŒrã1-rïŒã
ããã§ããã©ã¡ãŒã¿ãŒã¯[r-fãr + f]ã®ç¯å²ã§å€æŽãããŸãã
å€ã®å¯å€ç¯å²ã®ãå¹
ããå¶åŸ¡ããå¥ã®ãã©ã¡ãŒã¿ãŒ-Gainãéé[0ã1]ã®å€ã远å ããŸãã
倿Žããããµã³ãã«å€ã«å¯ŸããŠæ¬¡ã®åŒãååŸããŸãã
次ã«ããªã·ã¬ãŒã¿ãŒã®åäœã決å®ããå¿
èŠããããŸãã LFOã¯ã©ã¹ã¯ããµã³ãã«ã®é
åãçæãŸãã¯å€æŽããŸããã ãŸãããªã·ã¬ãŒã¿ãŒãæ©èœããã«ã¯ãçµéæéãèŠããŠããå¿
èŠããããŸãã ãããã£ãŠãProcess颿°ïŒIAudioStreamã¹ããªãŒã ïŒã§IProcessorã€ã³ã¿ãŒãã§ã€ã¹ãç¶æ¿ããæž¡ããããµã³ãã«ã®æ°ãèæ
®ããŸãã SampleRateã§é€ç®ãããšãçµéæéãååŸãããŸãã
ã·ã³ã»ãµã€ã¶ãŒã«ã¯ãLFOãããŒã¹ãããŒã¯ãšåæããããªãã·ã§ã³ããããŸãã ç§ãã¡ã«ãšã£ãŠãããã¯ïŒMidiListenerOnNoteOnãã³ãã©ãŒïŒãã¯ãªãã¯ãããšãã«ãçºæ¯åšã®äœçžããªã»ããããïŒæéã0ã«ãªã»ããããïŒå¿
èŠãããããšãæå³ããŸãã MatchKeyã¹ã€ãããã©ã¡ãŒã¿ãŒããããæ
åœããŸãã
ãµã³ãã«ModifyRealValueã®å€ãèšç®ãã颿°ã¯ãcurrentValueãã©ã¡ãŒã¿ãŒã®çŸåšå€ãšçŸåšã®ãµã³ãã«çªå·sampleNumberãå
¥åãšããŠåãåããŸãã 倿Žãããå€ãæ£ãã䜿çšããæ¹æ³ã以äžã«ç€ºããŸãã æ¬¡ã«ãModifyRealValue颿°ãããµã³ãã«ã®çä¿¡é
åïŒProcess颿°å
ïŒã®åãµã³ãã«ã«å¯ŸããŠåŒã³åºãããããšãçè§£ããå¿
èŠããããŸãã
次ã®ã¡ãœãããååŸããŸãã
public void Process(IAudioStream stream) { _time += Processor.CurrentStreamLenght / Processor.SampleRate; } public double ModifyRealValue(double currentValue, int sampleNumber) { var gain = Gain.Value; if (DSPFunctions.IsZero(gain)) return currentValue; var amplitude = GetCurrentAmplitude(sampleNumber); gain *= amplitude * Math.Min(currentValue, 1 - currentValue); return DSPFunctions.Clamp01(currentValue + gain); } private double GetCurrentAmplitude(int sampleNumber) { var timePass = sampleNumber / Processor.SampleRate; var currentTime = _time + timePass; var sample = WaveGenerator.GenerateNextSample(OscillatorType.Value, Frequency.Value, currentTime); return sample; } private void MidiListenerOnNoteOn(object sender, MidiListener.NoteEventArgs e) { if (MatchKey.Value) _time = 0; }
LFOã¯ã©ã¹ã§æãéèŠãªãã©ã¡ãŒã¿ãŒã¯ãå€èª¿ããããã©ã¡ãŒã¿ãŒã®ãªã³ã¯/ååã§ãã ãããè¡ãã«ã¯ãParameterNameã¯ã©ã¹ãäœæããå¿
èŠããããŸãããã®ã¯ã©ã¹ã«ã¯ãå€èª¿å¯èœãªãã©ã¡ãŒã¿ãŒã®ãªã¹ãã衚瀺ãããŸãã IntegerParameterãèŠãŠã¿ãŸãããããã©ã¡ãŒã¿ãŒã®å€ã¯ãParametersManagerã®ãã©ã¡ãŒã¿ãŒã®ã·ãŒã±ã³ã¹å
ã®æ°ãæå³ããŸãã èœãšã穎-æå€§ãã©ã¡ãŒã¿ãŒå€-éçºããã»ã¹äžã«å€æŽããããã©ã¡ãŒã¿ãŒã®ç·æ°ãæå®ããå¿
èŠããããŸãã
class ParameterName : IntegerParameter { private readonly ParametersManager _parametersManager; public ParameterName(string parameterPrefix, ParametersManager parametersManager) : base(parameterPrefix + "Num", "LFO Parameter Number", "Num", -1, 34, 1, false) { _parametersManager = parametersManager; } public override int FromStringToValue(string s) { var parameter = _parametersManager.FindParameter(s); return (parameter == null) ? -1 : _parametersManager.GetParameterIndex(parameter); } public override string FromValueToString(int value) { return (value >= 0) ? _parametersManager.GetParameter(value).Name : "--"; } }
IParameterModifierã€ã³ã¿ãŒãã§ã€ã¹ãšçŸåšã®ãã©ã¡ãŒã¿ãŒå€ã®äœ¿çš
ããã§ããã©ã¡ãŒã¿ãŒã¯ã©ã¹ã¯ãã®å€èª¿ãå¯èœãã©ããã倿ããå¿
èŠããããŸãã ç§ãã³ãŒãã£ã³ã°ããã·ã³ã»ãµã€ã¶ãŒã§ã¯ãåçŽãªã±ãŒã¹ãèæ
®ãããŠããŸã-LFOã¯ã©ã¹ã®ãªããžã§ã¯ãã1ã€ãããå€èª¿ã§ãããã©ã¡ãŒã¿ãŒã¯1ã€ã ãã§ãã
public interface IParameterModifier { double ModifyRealValue(double currentValue, int sampleNumber); }
ãã©ã¡ãŒã¿ãŒã¯1ã€ã®IParameterModifierã«é¢é£ä»ããããšãã§ããããããªã³ã¯ãšParameterModifierããããã£ãäœæããŸãã å®éã®å€ãååŸããã«ã¯ãValueããããã£ã®ä»£ããã«ProcessedValueã¡ãœããã䜿çšããå¿
èŠããããŸã;ãã®ããã«ã¯ãçŸåšã®ãµã³ãã«çªå·ã転éããŸãã
public abstract class Parameter { ... private IParameterModifier _parameterModifier; public bool CanBeAutomated { get; } public IParameterModifier ParameterModifier { get { return _parameterModifier; } set { if (_parameterModifier == value) return; if (_parameterModifier != null && !CanBeAutomated) throw new ArgumentException("Parameter cannot be automated."); _parameterModifier = value; } } public double ProcessedRealValue(int sampleNumber) { if (_parameterModifier == null) return RealValue; var modifiedRealValue = _parameterModifier.ModifyRealValue(RealValue, sampleNumber); return modifiedRealValue; } ... } public abstract class Parameter<T> : Parameter where T : struct { ... public T ProcessedValue(int sampleNumber) { return FromReal(ProcessedRealValue(sampleNumber)); } ... }
Valueã®ä»£ããã«ProcessedValueã¡ãœããã䜿çšãããšãsampleNumberãã©ã¡ãŒã¿ãŒãæž¡ãå¿
èŠããããããããã°ã©ãã³ã°ãå°ãè€éã«ãªããŸãã LFOã¯ã©ã¹ãäœæãããšãããã¹ãŠã®ã¯ã©ã¹ã®ãã©ã¡ãŒã¿ãŒã®å€ãProcessedValueã«å€æŽããå¿
èŠããããŸããã åºæ¬çã«ããµã³ãã«ã¯ã«ãŒãã§åŠçãããsampleNumberãæž¡ãããšã¯å€§ããªåé¡ã§ã¯ãããŸããã§ããã
LFOã¯ã©ã¹ã§ã¯ããã©ã¡ãŒã¿ãŒParameterNameã倿Žããããã®ãã³ãã©ãŒãäœæããŸããããã®äžã§ãã©ã¡ãŒã¿ãŒParameterModifierãããã«å€æŽããå¿
èŠããããŸãã
LFOã¯ã©ã¹ã³ãŒã public class LFO : SyntageAudioProcessorComponentWithParameters<AudioProcessor>, IProcessor, IParameterModifier { private double _time; private Parameter _target; private class ParameterName : IntegerParameter { private readonly ParametersManager _parametersManager; public ParameterName(string parameterPrefix, ParametersManager parametersManager) : base(parameterPrefix + "Num", "LFO Parameter Number", "Num", -1, 34, 1, false) { _parametersManager = parametersManager; } public override int FromStringToValue(string s) { var parameter = _parametersManager.FindParameter(s); return (parameter == null) ? -1 : _parametersManager.GetParameterIndex(parameter); } public override string FromValueToString(int value) { return (value >= 0) ? _parametersManager.GetParameter(value).Name : "--"; } } public EnumParameter<WaveGenerator.EOscillatorType> OscillatorType { get; private set; } public FrequencyParameter Frequency { get; private set; } public BooleanParameter MatchKey { get; private set; } public RealParameter Gain { get; private set; } public IntegerParameter TargetParameter { get; private set; } public LFO(AudioProcessor audioProcessor) : base(audioProcessor) { audioProcessor.PluginController.MidiListener.OnNoteOn += MidiListenerOnNoteOn; } public override IEnumerable<Parameter> CreateParameters(string parameterPrefix) { OscillatorType = new EnumParameter<WaveGenerator.EOscillatorType>(parameterPrefix + "Osc", "LFO Type", "Osc", false); Frequency = new FrequencyParameter(parameterPrefix + "Frq", "LFO Frequency", "Frq", 0.01, 1000, false); MatchKey = new BooleanParameter(parameterPrefix + "Mtch", "LFO Phase Key Link", "Match", false); Gain = new RealParameter(parameterPrefix + "Gain", "LFO Gain", "Gain", 0, 1, 0.01, false); TargetParameter = new ParameterName(parameterPrefix, Processor.PluginController.ParametersManager); TargetParameter.OnValueChange += TargetParameterNumberOnValueChange; return new List<Parameter> {OscillatorType, Frequency, MatchKey, Gain, TargetParameter}; } public void Process(IAudioStream stream) { _time += Processor.CurrentStreamLenght / Processor.SampleRate; } public double ModifyRealValue(double currentValue, int sampleNumber) { var gain = Gain.Value; if (DSPFunctions.IsZero(gain)) return currentValue; var amplitude = GetCurrentAmplitude(sampleNumber); gain *= amplitude * Math.Min(currentValue, 1 - currentValue); return DSPFunctions.Clamp01(currentValue + gain); } private double GetCurrentAmplitude(int sampleNumber) { var timePass = sampleNumber / Processor.SampleRate; var currentTime = _time + timePass; var sample = WaveGenerator.GenerateNextSample(OscillatorType.Value, Frequency.Value, currentTime); return sample; } private void MidiListenerOnNoteOn(object sender, MidiListener.NoteEventArgs e) { if (MatchKey.Value) _time = 0; } private void TargetParameterNumberOnValueChange(Parameter.EChangeType obj) { var number = TargetParameter.Value; var parameter = (number >= 0) ? Processor.PluginController.ParametersManager.GetParameter(number) : null; if (_target != null) _target.ParameterModifier = null; _target = parameter; if (_target != null) _target.ParameterModifier = this; } }
ãããã«
ããã«ã€ããŠã¯ãèšäºã·ãªãŒãºãå®äºãããšèããŠããŸããã·ã³ã»ãµã€ã¶ãŒã®æãéèŠãªã³ã³ããŒãã³ãïŒãã¡ãããç§ã®æèŠã§ã¯ïŒã«ã€ããŠèª¬æããŸãããæ³¢åœ¢çæããšã³ãããŒãåŠçããã£ã«ã¿ãªã³ã°ããšãã§ã¯ãããã©ã¡ãŒã¿ãŒå€èª¿ã§ãã å Žæã§ã®ããã°ã©ãã³ã°ã¯ãæé©åãªãã®çæ³ããã¯ã»ã©é ããã®ã§ãããå¯èœãªéãæç¢ºãªã³ãŒããæžãããã£ãã®ã§ãã 奜å¥å¿itiveçãªç ç©¶è
ã¯ãèªåã®ã³ãŒããåãåãã奜ããªã ãå®éšããããšãã§ããŸã-ç§ã¯ããã«ã€ããŠã®ã¿æºè¶³ããŠããŸãïŒ äž»ã«C ++ã§äœæãããããŸããŸãªãµãŠã³ãåæããã³åŠççšã®ãœãŒã¹ã³ãŒãã®å€§èŠæš¡ãªã¢ãŒã«ã€ããåããåªããmusicdsp.orgãµã€ãããããŸãã
èå³ã®ããçãããããããšãïŒ ç§ã®èšäºãGoogleããèŠããããã«ãªããåå¿è
ã鳿¥œããã°ã©ãã³ã°ãšä¿¡å·åŠçã®äžçã«å
¥ãã®ã«åœ¹ç«ã€ãšç¢ºä¿¡ããŠããŸãã ã³ã¡ã³ããç¹ã«Refridgeratorãããããšã ã
ãã¹ãŠã«è¯ãïŒ
ããã°ã©ãã³ã°ã§é 匵ã£ãŠãã ããïŒ
åç
§è³æ
以åã®èšäºã®èšäºãšæ¬ã®ãªã¹ããå¿ããã«èŠãŠãã ããã
- æåãªãšãã§ã¯ãã®ãªãŒãã£ãªäŸ
- wikisound.org/Distortion
- ãªããŒãã«ã€ããŠ
- ããŸããŸãªDSPã¢ã«ãŽãªãºã ã®ãœãŒã¹
- ã·ã³ã»ãµã€ã¶ãŒã®ããã°ã©ãã³ã°ã®ãã³ã