Я работаю на звуковой модификатором, который бы:Как изменить параметры функции в режиме реального времени с Matlab
1) Получить входные данные от пользователя (X, Y)
2) Применение эффектов к заранее определенному звуковому файлу с помощью X и Y
кода является немного трудно следить, чтобы я не выложу его, если не хотел иначе.
У меня есть функция называется effectBox.m:
function[] = effectBox(x,y)
Поскольку это название предполагает, что это относится эффекты к 10 последовательных выборок звука в цикле.
Я хочу изменить (x, y) каждый раз, когда происходит событие.
Я использовал функцию обратного вызова:
function sounder()
f=figure;
set(f,'WindowButtonMotionFcn',@effectBox);
Когда мышь движется он принимает первое значение X и Y, которое инициировало событие и применяет эффекты на всех 10 образцах. Однако я хочу, чтобы он менялся каждый раз, когда мышь перемещается снова.
Иными словами, sounder.m вызывает и поставляет первый набор входов для effectBox.m, но я хочу, чтобы он мог делать то же самое, даже когда код работает.
Я работаю над этим проектом в течение длительного времени, и я действительно не мог понять, как преодолеть это препятствие. Как я могу это исправить?
Edit: Вот мой код, который работает для effectBox.m
clc
clear all
%Load Sound File
[ses Fs] = wavread ('C:\Users\Ogulcan\Desktop\Bitirme Projesi\Codes\kravitz.wav');
%Adjust the sound file so that both channels represent a 1-D matrix
leftChannel = ses(:,1);
rightChannel = ses(:,2);
sound = (leftChannel + rightChannel)/2;
%length of the sample
t=length(sound);
%number of samples
ns=10;
i=1;
per=t/ns;
%Divide the sample into 5 parts and apply vibrato and pitchshift to each sample.
while i<ns;
global x
global y
coords = get(0,'PointerLocation');
%the timer object triggers every second. If you need it faster, decrease the value for
%Period
timerObj = timer('TimerFcn',@timerCallback,'Period', per);
x=coords(1);
y=coords(2);
start(timerObj);
v=sound(i*t/ns:(i+1)*t/ns);
e1 = pitchShift(v,1024,256,x/100);
a=size (e1+1);
vl = 1:a(2);
k = vl/5000;
%The cursors position in the x axis is our input.
vib= sin(pi*y*k/450);
%Add the vibrato effect to the sound
e=(e1.*vib);
wavplay(10*e,44100);
if i==9
i=1;
end
i=i+1;
end
примечание: pitchshift это функция, которая изменяет высоту заданного звукового файла.
Что вызывает вызов effectBox? Является ли это каким-то образом синхронизировано с событиями мыши? Если нет, то лучше всего будет использовать глобальную переменную, которая имеет текущую позицию мыши (обновляется вашим обработчиком мыши и ссылается всякий раз, когда вызывается эффектBox); если это так, вы вызываете effectBox из обработчика события мыши. Будет ли это работать - или я полностью пропустил ваш вопрос? – Floris
@Floris ЭффектBox запускается с помощью WindowButtonMotionFcn. Если вы ссылаетесь на событие, когда actionBox начинает работать. Я не очень хорошо разбираюсь в терминологии. Можете ли вы показать мне пример этой глобальной переменной? Я тоже проверю его.Большое спасибо за ответ. – Ocul
Вы не должны вызывать свою функцию обратного вызова. При этом 'x' будет вашим дескриптором вызывающего, а' y' будет eventdata. Вы хотите передать пользовательские входы в 'effectBox'? – HebeleHododo