2013-05-08 4 views
1

Я работаю на звуковой модификатором, который бы:Как изменить параметры функции в режиме реального времени с 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 это функция, которая изменяет высоту заданного звукового файла.

+1

Что вызывает вызов effectBox? Является ли это каким-то образом синхронизировано с событиями мыши? Если нет, то лучше всего будет использовать глобальную переменную, которая имеет текущую позицию мыши (обновляется вашим обработчиком мыши и ссылается всякий раз, когда вызывается эффектBox); если это так, вы вызываете effectBox из обработчика события мыши. Будет ли это работать - или я полностью пропустил ваш вопрос? – Floris

+0

@Floris ЭффектBox запускается с помощью WindowButtonMotionFcn. Если вы ссылаетесь на событие, когда actionBox начинает работать. Я не очень хорошо разбираюсь в терминологии. Можете ли вы показать мне пример этой глобальной переменной? Я тоже проверю его.Большое спасибо за ответ. – Ocul

+0

Вы не должны вызывать свою функцию обратного вызова. При этом 'x' будет вашим дескриптором вызывающего, а' y' будет eventdata. Вы хотите передать пользовательские входы в 'effectBox'? – HebeleHododo

ответ

0

Прочитав ваши комментарии и код более тщательно, глобальные переменные не нужны. Вместо этого:

function effectBox(X,Y) 
    % whatever code you need here... 

Настройка обратного вызова:

h = figure; % create new figure, get handle 
set h, 'WindowButtonMotionFcn', @mouseMove); % execute mouseMove when mouse moves 

И обратного вызова выглядит следующим образом:

Function mouseMove() 
    C = get (gca, 'CurrentPoint'); % read current position of mouse when it moves 
    effectBox(C(1), C(2)); % calls effectBox with mouse coordinates X,Y 

Примечание - я не смог проверить это, как я не рядом с машиной с лицензией Matlab. Если что-то не работает должным образом, скажите мне в комментариях, и я помогу вам понять это.

+0

@ Флорис Спасибо за ваш ответ. Прошу прощения за поздний ответ. Я пробовал ваше предложение, увы, он не внес каких-либо изменений. Код не работает так, как я этого хочу. Он не режет песню в середине, она просто ждет завершения цикла и затем принимает текущую точку. Я не знаю, может быть, это фотография профиля, но я считаю, что вы можете мне помочь, я могу опубликовать код, если вы хотите. Тем не менее большое спасибо вам и всем тем, кто ответил. – Ocul

+0

Я вижу. Проблема в том, что 'effectBox' обрабатывает весь файл сразу; если вы его еще раз вызовете, вы не будете прерывать то, что делаете. Вам нужно будет показать немного больше того, что вы делаете в effectBox - и да, мы можем вернуться к использованию глобальных переменных, если моя догадка правильная ... Если я понимаю вашу коррекцию вопроса, вы должны иметь возможность обновлять параметры, используемые для обработки в середине песни. Если вы не покажете обработку песни более подробно, я не могу помочь. Но когда вы это сделаете - возможно, я смогу. Так что да - отправьте код; увидит, что я могу сделать. Не обещаю. – Floris

+0

Я добавил код. Я надеюсь, что это помогает. – Ocul

Смежные вопросы