Orinj Структура на ефектите Примерен дилей Delay.java

Orinj версия 7.0.0

Бележка: Тази страница не е за потребителите на Orinj, а за програмистите, които искат да създават ефекти за работа с цифрови сигнали за Orinj.

Класът Delay.java е част от примерния ефект в Orinj Примерен Дилей (Example Delay).

Delay.java

Променливите в този клас са следните.

MINDELAY – крайна статична променлива, която определя минималното забавяне в секунди
MAXDELAY – крайна статична променлива, която определя максималното забавяне в секунди
MINDECAY – крайна статична променлива, която определя минималното отношение на затихване
MAXDECAY – крайна статична променлива, която определя максималното отношение на затихване
m_delay – самото забавяне определено от потребителя, в секунди
m_decay – самото затихване определено от потребителя, отношението на амплитудата на забавеното повторение на сигнала към амплитудата на оригиналния сигнал
m_storeBuffers – една поредица от буфери от байтове, която е необходима за да се пазят миналите данни с аудио
m_delayOriginal – стойността на забавянето, която ще се запази за undo (за отменяне на промените), за да ограничим броя на операциите undo, както е описано по-долу
m_decayOriginal – стойността на затихването, която ще се запази за undo (за отменяне на промените), за да ограничим броя на операциите undo, както е описано по-долу

Този клас развива Undo и осъществява EffectInterface (виж Orinj Структура на ефектите oreffect JAR). И двата са задължителни, така че Orinj да може да създаде ефекта.

Статичните декларации за минималните и максимални забавяния и затихвания не са необходими, но е добре да ги има, така че кода да може последователно да проверява за потенциални грешки в стойностите на забавянето и затихването. Използват се и в класа Delay.java за да се проверяват входните данни при промените в m_delay и m_decay и в класа DelayPanel.java class за да се проверят данните вкарани от потребителя.

m_storeBuffers е необходима в този ефект (а и повечето други ефекти), защото този ефект трябва да гледа в миналото и защото данните с аудио се изпращат към този ефект на части. Текущата стойност на повторението – забавения и затихнал сигнал – е равна на една минала стойност (със затихване) на оригиналния сигнал, която може да е в една част, изпратена към ефекта преди. Ефектът използва m_storeBuffers за да пази миналите части на аудиото, така че да може да ги използва в текущите изчисления. Тази променлива е описана и по-долу.

Функциите в този клас са следните.

  • Delay() – единственият конструктор. Този конструктор определя началните стойности на забавянето и затихването и създава поредицата от буфери от байтове.
  • float getDelay() – тази функция връща m_delay, стойността на забавянето, определено от потребителя
  • void setDelay(float delay) – тази функция променя m_delay, стойността на забавянето определено от потребителя, на стойността на аргумента delay. Следното е кода на тази функция.
  •  
  • public void setDelay(float delay, boolean storeUndo)
  • {
  •    if (delay MAXDELAY)
  •       System.out.println("Error in Delay::setDelay: Error in delay");
  •    delay = Math.min(MAXDELAY, Math.max(MINDELAY, delay));
  •    m_delay = delay;
  •  
  •    if (m_delayOriginal != delay && storeUndo)
  •    {
  •       m_delay = m_delayOriginal;
  •       fireEffectUndoEvent(new EffectUndoEvent(this, "Undo Delay"));
  •       m_delay = delay;
  •       m_delayOriginal = m_delay;
  •    }
  • }
  •  
  • Забележи първо, че тази функция има два аргумента.
  •  
    • delay – стойността на забавянето (определена от потребителя).
    • storeUndo – true, ако ефектът трябва да запази своите данни за бъдещи undo (отменяния на промените); false, иначе
  •  
  • В първите две линии по-горе, функцията проверява дали входното забавяне е в позволените граници. След това функцията слага стойността на забавянето в позволените граници и променя m_delay в ефекта.
  •  
  • Останалите линии запазват информация, така че тази промяна да може да бъде отменена, ако трябва. Забележи, че стойността на забавянето в ефекта се определя от графичния интерфейс за потребителя и може да се определи или от една кутия с текст или от един плъзгач (защото създадохме графичния интерфейс, така че да има и кутия и плъзгач). Интерфейсът обработва промените в кутията и плъзгача по различни начини (например actionPerformed, focusLost), но при създаването на ефекта решихме да пазим информация само когато потребителят премести фокуса от един от тези контроли. Така, запазването на информация за промените, така че да могат да бъдат отменени, става по-рядко. Потребителят може например да премести плъзгача нагоре или надолу няколко пъти, което ще промени стойността на забавянето в ефекта и резултатът ще се чуе при свиренето, но информацията за undo ще бъде запазена само ако потребителят премести фокуса от плъзгача.
  •  
  • Първо, функцията проверява дали текущата стойност на забавянето е различна от стойността на m_delayOriginal. m_delayOriginal се променя само когато информация за undo се запазва. Така, запазената стойност ще бъде тази след предишното запазване ще бъде запазена, вместо текущата стойност на m_delay. След това функцията изпраща едно съобщение за undo, което кара Orinj да запази информацията за ефекта. Накрая, функцията променя m_delay на подходящата стойност.
  •  
  • Работата с undo не е необходима. Узползването на плъзгачи или няколко контроли за една и съща стойност в ефекта също не е необходимо. Осъществяването на тази функция може да е доста по-просто.
  •  
  • float getDecay() – тази функция връща m_decay, стойността на затихването, определено от потребителя
  • void setDecay(float decay) – тази функция променя m_decay, стойността на затихването, определено от потребителя, на стойността на аргумента decay. Тази функция е осъществена по същия начин, както setDelay по-горе.
  • void allowsDryWetMix() – тази функция трябва просто да върне true, ако ефектът позволява сух и мокър микс (виж Orinj Структура на ефектите oreffect JAR). Orinj отделно ще позволи на потребителя да определи стойностите на сухия и мокрия микс (между 0% и 100% амплитудата на сигнала).
  • void allowsSideChaining() – тази функция трябва просто да върне true, ако ефектът позволява странични връзки и false, ако ефектът не позволява странични връзки (виж Orinj Структура на ефектите oreffect JAR).
  • boolean startPlay() – тази функция трябва да съдържа действията, които трябва да се извършат в началото на свиренето, каквито и да са. В този ефект, тази функция просто изпразва m_storeBuffer за да премахне данни са аудио, които може да са останали от предишни свирения, така че тези данни да не се чуят в текущото свирене. Тази функция връща true, защото няма грешки.
  • void stopPlay() – тази функция трябва да съдържа действията, които трябва да се извършат на края на свиренето, каквито и да са. Рядко ще има такива действия. В повечето ефекти в Orinj, тази функция е празна.
  • void setLanguage(String language) – тази функция определя езика на текста, който се използва в графичния интерфейс за ефекта и за съобщенията за грешки, които могат да бъдат показани на потребителя. Аргументът language е кода за езика от три букви според ISO 693-2, който трябва да бъде използван. В този пример, тази функция е празна и потребителят винаги ще вижда текста на английски. Ефектите в Orinj и самият Orinj използват файлове XML, които превеждат всичкият текст в езиците, които Orinj поддържа. Тази връзка съдържа схемата в XML за файловете XML с езиците. Не е задължително да поддържаш няколко езика. Ако поддържаш няколко езика, не е задължително да поддържаш тези, които се използват в Orinj, но е добре да избереш един език по подразбиране, за случаите, в които Orinj избира език, който твоя ефект не поддържа.
  • boolean writeObject(WriteInterface ar) – Orinj не използва интерфейса Java Serializable, а осъществява свой собствен код. Така, тази функция е необходима, така че данните за ефектите да могат да бъдат запазени като част от сесията или лупинга или като предопределени настройки. Тази функция се използва и за да се запазят данните на ефекта, така че промени в ефекта да могат да бъдат върнати. Тази функция трябва да върне true, ако запазването не срещне грешки и false, ако има някаква грешка.
  • boolean readObject(ReadInterface ar) – подобно на предишната функция, тази функция трябва да бъде осъществена, така че данните за ефектите да могат да бъдат четени от сесиите, лупингите, файловете с предопределените настройки и при връщането на промени. Тази функция трябва да върне true, ако четенето не срещне грешки и false, ако има някаква грешка.
  • void setEqual(EffectInterface effect) – тази функция в момента не се използва от Orinj, но трябва да бъде осъществена, ако Orinj започне да я използва в бъдещето. Тази функция прави данните в ефекта равни на тези в един друг ефект, който е аргумента effect. Тази функция трябва да провери дали аргумента effect е от същия клас, както текущия ефект.
  • boolean apply(int [] buffer, int [] controlbuffer, int channels, float samplingRate, double time, float drymix, float wetmix, Envelope dryMixEnvelope, Envelope wetMixEnvelope) – тази функция изчислява ефекта. Взема един оригинален сигнал (buffer) и връща сумата на оригиналния сигнал и един забавен и затихнал сигнал (също buffer). Тази функция връща true, когато няма грешки и false, когато има грешки.
  • Забележи начина, по който тази функция apply запазва данните са аудио със следния код.
  •  
    • byte [] storeBuffer = new byte [dry.length];
    • System.arraycopy(buffer, 0, storeBuffer, 0, buffer.length);
    • m_storeBuffers.add(storeBuffer);
  •  
  • Тази функция създава един нов буфер и копира данните с аудио в новия буфер. Аудио буферът (променливата buffer) е изпратен по референпия към тази функция и ще се използва пак от Orinj след тази функция. Данните и с аудио ще се променят. Затова данните с аудио трябва да се копират в един нов буфер.
  •  
  • Забележи, че запазените буфери се премахват, когато вече не са необходими. Това е необходимо, защото данните с аудио може да са големи и не трябва да се пазят в паметта. Функцията изчислява първия буфер, който ще бъде използван в поредицата m_storeBuffers (с номер curBuffer). Докато curBuffer е по-голям от нула, първият буфер в поредицата не е необходим и трябва да се премахне. Следното е съответния код.
  •  
    • while (curBuffer > 0)
    • {
    •    m_storeBuffers.remove(0);
    •    curBuffer--;
    • }

Виж също:
Orinj Структура на ефектите

Добави нов коментар

Filtered HTML

  • Freelinking helps you easily create HTML links. Links take the form of [[indicator:target|Title]]. By default (no indicator): Click to view a local node.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.