Положение руки не обновляется, как ожидалось - скачок при обработке - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь создать термен, используя контроллер Leap Motion с помощью Processing (Java).Пока я подошел очень близко.Я могу изменить высоту и амплитуду, держа одну руку неподвижно над контроллером, в то время как другая движется.Я надеялся сделать так, чтобы одна рука могла это сделать, или левая рука контролировала амплитуду, в то время как правая контролирует высоту тона.

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

Вот код:

import processing.sound.*;
import de.voidplus.leapmotion.*;

LeapMotion leap;

ArrayList<PVector> points; 
PVector fp;

float freq;
float amp;

TriOsc tri;
SinOsc sin;
SqrOsc sqr;
SawOsc saw;

void setup () {

  size(640,800);

  leap = new LeapMotion(this);
  points = new ArrayList<PVector>();

  tri = new TriOsc(this);    
  sin = new SinOsc(this);
  sqr = new SqrOsc(this);
  saw = new SawOsc(this);

}

void leapOnInit() {
  // println("Leap Motion Init");
}
void leapOnConnect() {
  // println("Leap Motion Connect");
}
void leapOnFrame() {
  // println("Leap Motion Frame");
}
void leapOnDisconnect() {
  // println("Leap Motion Disconnect");
}
void leapOnExit() {
  // println("Leap Motion Exit");
}

void draw() {

  tri.freq(freq);
  tri.amp(amp);
  tri.play();

    for (Hand hand : leap.getHands()) {

       fp   = hand.getPosition(); 
       if (fp.z <= 30) {
       points = new ArrayList<PVector>();
    }

    else if (fp.z > 30) {
       points.add(new PVector(fp.x, fp.y));
    }
  }

  for (int i = points.size()-1; i >= 0; i--) {
     PVector p = points.get(i);
     amp = map(width-p.x, 0, width, 1, .01); //Volume based on x-axis
     freq = map(height-p.y, 0, height, 40, 880); //Pitch based on y-axis
  }
}

1 Ответ

0 голосов
/ 14 декабря 2018

Хорошо, я понял.Кстати, пусть будет известно, что в документации по SDK Leap Motion используется ПОЛНОСТЬЮ РАЗНАЯ БИБЛИОТЕКА из той, которая фактически импортируется, когда вы выбираете «Эскиз> Библиотека импорта ...> Перемещение движения для обработки» при обработке.Я потратил полдня, пытаясь выяснить, почему их примеры кодирования использовали классы, не сообщая вам, что в них ...

Документация была разочаровывающей, поэтому я не использовал ее и не делал своего собственного взаимодействиякоробка.Вместо этого я поигрался с кодом, который у меня был, и обнаружил, что в моих чтениях испорчено утверждение «else».Как только я избавился от этого, проклятая штука сработала как шарм.У меня даже получилось разделить "amp" и "freq" на мои левую и правую руки!

Вот как это выглядит:

import processing.sound.*;
import de.voidplus.leapmotion.*;

LeapMotion leap;
Theremin leapTheremin;

ArrayList<PVector> points; 
PVector handPos;

TriOsc tri;

void setup () {

  size(640,800);

  leap = new LeapMotion(this);
  points = new ArrayList<PVector>();

  tri = new TriOsc(this);    

  leapTheremin = new Theremin(tri);

}

void draw() {

  leapTheremin.renderSound();

  for (Hand hand : leap.getHands()) {

      handPos = hand.getPosition(); 
      boolean handIsLeft = hand.isLeft();
      boolean handIsRight = hand.isRight();

      if (handPos.z <= 75) {
       points = new ArrayList<PVector>();
       points.add(new PVector(handPos.x, handPos.y));
       background((handPos.x)/2.5,(width-handPos.x)/3,handPos.y-(height/3.5));
      }

       if (hand.isRight()) {
        leapTheremin.setPitch();
   }

      if (hand.isLeft()) {
        leapTheremin.setVolume();
      }   
   }
}

class Theremin {

float freq;
float amp;
int sound;

Theremin (TriOsc tri_g) {

  setPitch();

  sound = 1;

  tri = tri_g;

}

  void setPitch () {

    for (int i = points.size()-1; i >= 0; i--) {
    PVector p = points.get(i);
    freq = map((height-handPos.y)+10, 0, height, 40, 880); //"upright antenna", aka "the right one that controls pitch"
    // To match the colors with the moaods of the pitches   

    }   
  }

  void setVolume() {

    for (int i = points.size()-1; i >= 0; i--) {
    PVector p = points.get(i);
    amp = map(width-p.x, 0, width, 1, .01); //"loop antenna", aka "the left one that controls volume" 

    }
  }

  void renderSound() {
    tri.freq(freq);
    tri.amp(amp);
    tri.play();

  }
}
...