Orinj версия 9.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, както е описано по-долу
m_decayAutomation – автоматизация за m_decay, която позволява промени в стойността на затихването във времето
NUM_AUTOMATIONS – крайна статична променлива, която определя общия брой на автоматизациите в този ефект
AUTOMATION_DECAY – крайна статична променлива, която е позицията на m_decayAutomation в списъка с автоматизации в този ефект
Този клас развива Undo и осъществява EffectInterface (виж Orinj Структура на ефектите oreffect JAR). И двата са задължителни, така че Orinj да може да създаде ефекта.
Този клас развива и AutomationOwnerInteface, тъй като в този ефект има автоматизации (само една автоматизация). Ако в твоя ефект няма автоматизации, не е задължително да развиваш този интерфейс.
Статичните декларации за минималните и максимални забавяния и затихвания не са необходими, но е добре да ги има, така че кода да може последователно да проверява за потенциални грешки в стойностите на забавянето и затихването. Използват се и в класа Delay.java за да се проверяват входните данни при промените в m_delay и m_decay и в класа DelayPanel.java class за да се проверят данните вкарани от потребителя.
m_storeBuffers е необходима в този ефект (а и повечето други ефекти), защото този ефект трябва да гледа в миналото и защото данните с аудио се изпращат към този ефект на части. Текущата стойност на повторението – забавения и затихнал сигнал – е равна на една минала стойност (със затихване) на оригиналния сигнал, която може да е в една част, изпратена към ефекта преди. Ефектът използва m_storeBuffers за да пази миналите части на аудиото, така че да може да ги използва в текущите изчисления. Тази променлива е описана и по-долу.
m_storeBuffers не е най-бързото осъществяване, но най-лесно се разбира. Едно по-бързо осъществяване може да използва един буфер в кръг.
m_decayAutomation е една примерна автоматизация. Един ефект може да има автоматизации за повече от един параметър. Един ефект може и да има и нула автоматизации. NUM_AUTOMATIONS и AUTOMATION_DECAY не са необходими, но правят развитието на AutomationOwnerInterface по-ясно.
Функциите в този клас са следните.
- Delay() – единственият конструктор. Този конструктор определя началните стойности на забавянето и затихването и създава поредицата от буфери от байтове.
- float getDelay() – тази функция връща m_delay, стойността на забавянето, определено от потребителя
- void setDelay(float delay) – тази функция променя m_delay, стойността на забавянето определено от потребителя, на стойността на аргумента delay. Следното е кода на тази функция.
- public void setDelay(float delay, boolean storeUndo)
- {
- if (delay < MINDELAY || 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, иначе
- Останалите линии запазват информация, така че тази промяна да може да бъде отменена, ако трябва. Стойността на забавянето се определя от интерфейса за потребителя и може да се определи или от една кутия с текст или от един плъзгач (защото създадохме интерфейса да има и кутия, и плъзгач). Запазването на информация за промените, така че да могат да бъдат отменени, става по-рядко. Потребителят може например да премести плъзгача нагоре или надолу няколко пъти, което ще промени стойността на забавянето в ефекта и резултатът ще се чуе при свиренето, но информацията за 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 allowsSideChaining() – тази функция трябва просто да върне true, ако ефектът позволява странични връзки и false, ако ефектът не позволява странични връзки (виж Orinj Структура на ефектите oreffect JAR).
- boolean startPlay() – тази функция трябва да съдържа действията, които трябва да се извършат в началото на свиренето, каквито и да са. В този ефект, тази функция просто изпразва m_storeBuffer за да премахне данни са аудио, които може да са останали от предишни свирения, така че тези данни да не се чуят в текущото свирене. Тази функция връща true, защото няма грешки.
- void stopPlay() – тази функция трябва да съдържа действията, които трябва да се извършат на края на свиренето, каквито и да са. Рядко ще има такива действия. В повечето ефекти в Orinj, тази функция е празна.
- boolean hasData() – тази функция казва на Orinj дали в ефекта има останали данни, които трябва да се преработят. Orinj ще разчита на тази функция по време на свиренето. Тази функция е важна при ефектите, които имат опашка. В този ефект например, ако забавянето е 500 ms, в края на свиренето или смесването, в дилея ще останат 500 ms данни, които трябва да се изсвирят за да се завърши забавеното повторение.
- 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, ако има някаква грешка.
- int getNumAutomations() – тази функция казва на Orinj колко контроли в този ефект са автоматизирани. След като автоматизациите са организирани в ефекта с правилните им граници и други параметри, тези автоматизации се управляват от Orinj, а не от ефекта. Orinj използва тази функция да управлява автоматизациите.
- Automation getAutomation(int index) – тази функция връща една от автоматизациите в ефекта. Orinj очаква, че автоматизациите са с индекс под ред и започващ от 0. Orinj използва тази функция за да показва и променя автоматизациите.
- boolean apply(int [] buffer, int [] controlbuffer, int channels, int channel, float samplingRate, double time, double timeStart, double timeEnd) – тази функция изчислява ефекта. Взема един оригинален сигнал (buffer) и връща сумата на оригиналния сигнал и един забавен и затихнал сигнал (също buffer). Тази функция връща true, когато няма грешки и false, когато има грешки.
- Аргументите на тази функция са описани подробно в Orinj Структура на ефектите oreffect.jar.
- Забележи начина, по който тази функция 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 Структура на ефектите
Добави нов коментар