Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.69 KB | None | 0 0
  1. import themidibus.*;
  2. import processing.video.*;
  3.  
  4. MidiBus myBus; // The MidiBus
  5.  
  6. boolean weiter = true;
  7.  
  8. Capture cam;
  9.  
  10. //ArrayList, in der Durchschnittswerte der Pixel gespeichert werden
  11. ArrayList<Pixel> pixelList = new ArrayList<Pixel>();
  12.  
  13. //Variablen zum Errechnen von Durchschnittswerten bei getAverage()
  14. float farbe = 0;
  15. float helligkeit = 0;
  16. float averageFarbe = 0;
  17. float averageHelligkeit = 0;
  18. boolean transkribiert = false;
  19.  
  20. //Pixelobjekt, welche in ArrayList 'pixelList' gespeichert wird
  21. Pixel myPixel;
  22.  
  23. //Zeigt an, ob Durchschnittswerte berechnet wurden
  24. boolean gotAverage = false;
  25.  
  26. //Startpunkte zum Durchlaufen des Bildes bei getAverage()
  27. int averageStartX1 = 0;
  28. int averageStartY1 = 0;
  29.  
  30. //Varible, in der Frameshot gespeichert wird
  31. PImage average;
  32.  
  33. void setup() {
  34. //Konfiguration Midi In/Out
  35. MidiBus.list();
  36. myBus = new MidiBus(this, "ProcessingIn", "LiveIn");
  37.  
  38.  
  39.  
  40. size(640, 480);
  41. String[] cameras = Capture.list();
  42.  
  43. //neues Pixelobjekt wird erstellt
  44. myPixel = new Pixel();
  45.  
  46. if (cameras.length == 0) {
  47. println("There are no cameras available for capture.");
  48. exit();
  49. } else {
  50. println("Available cameras:");
  51. for (int i = 0; i < cameras.length; i++) {
  52. println(cameras[i]);
  53. }
  54.  
  55. // The camera can be initialized directly using an
  56. // element from the array returned by list():
  57. cam = new Capture(this, cameras[0]);
  58. cam.start();
  59. }
  60. }
  61.  
  62. void draw() {
  63. //Colormode wird auf HSB gesetzt, damit Helligkeit und Farbwert genutzt werden können
  64. colorMode(HSB, 100);
  65.  
  66. if (cam.available() == true) {
  67. cam.read();
  68. }
  69.  
  70. image(cam, 0, 0);
  71. // The following does the same, and is faster when just drawing the image
  72. // without any additional resizing, transformations, or tint.
  73. //set(0, 0, cam);
  74.  
  75.  
  76. if (keyPressed == true)
  77. {
  78. cam.stop();
  79. saveFrame("average.png");
  80. average = loadImage("average.png");
  81. transkribiert = true;
  82. }
  83.  
  84.  
  85. if (transkribiert == true)
  86. {
  87. getAverage();
  88. }
  89. }
  90.  
  91. void getAverage()
  92. {
  93. //Es soll immer ein Quadrat von 20x20 Pixeln analysiert werden und jeder
  94. //Durchschnittswert eines Feldes in die ArrayList 'pixelList' in
  95. //einem Pixelobjekt gespeichert werden.
  96. //Die erste For-Schleife sorgt dafür, dass der X-Wert beim Durchlaufen
  97. //nach jeden Quadrat um 20 Pixelstellen verschoben werden soll.
  98. for (int x = averageStartX1; x < average.width; x+=20)
  99. {
  100. //Hier wird überprüft, ob der Startwert zum Auswerten der Quadrate
  101. //schon am Bildschirmrand angelangt ist
  102. if (averageStartX1 <= (average.width-20) && weiter ==true)
  103. {
  104. //Pixel des Bildes 'average' werden geladen
  105. loadPixels();
  106. average.loadPixels();
  107. //Diese Schleife ist zum Durchlaufen jedes einzelnen 20x20 Quadrats zuständig
  108. for (int i = averageStartX1; i < averageStartX1+20; i++) {
  109. for (int j = averageStartY1; j < averageStartY1+20; j++) {
  110. int loc = i + j * width;
  111. //Alternative zur Pixelanalyse von pixels[loc]
  112. //color pixel = average.get(averageStartX1+i, averageStartY1+j);
  113. color pixel = pixels[loc];
  114. //Farbewert und Helligkeit des Pixels werden in Variablen überschrieben
  115. farbe = hue(pixel);
  116. //println(farbe +"FARBE");
  117. helligkeit = brightness(pixel);
  118. //println("HELLIGKEIT"+helligkeit);
  119.  
  120. //Farbe und Helligkeit jedes Pixels werden den Durchschnittsvariblen hinzugefügt
  121. averageFarbe += farbe;
  122. averageHelligkeit += helligkeit;
  123. }
  124. }
  125.  
  126. //Ein neues Pixelobjekt wird erstellt.
  127. //Es erhält die Parameter Farbe und Helligkeit, die vorher durch die
  128. //Anzahl der Pixel, die durchlaufen wurden, geteilt wird.
  129. //Die Farb- und Helligkeitswerten werden auf die Anzahl der Halbtonschritte
  130. //gemappt, die diese vo Grundton entfernt sind.
  131. //Anschließend wird das Objekt der ArrayList hinzugefügt.
  132. myPixel = new Pixel(selectTune(averageFarbe/400), findOctave(averageHelligkeit/400));
  133. pixelList.add(myPixel);
  134.  
  135. //Farbe und Helligkeit werden wieder auf 0 gesetzt, damit sie im nächsten
  136. //Durchgang neu verwendet werden können.
  137. averageFarbe = 0;
  138. averageHelligkeit = 0;
  139.  
  140. weiter = false;
  141. //Es wird überprüft, ob der X-Wert kurz vor dem Rand des Bildes ist
  142. } else if (averageStartX1 > (average.width - 20))
  143. {
  144. //In diesem Fall wird der Y-Wert um eine Reihe nach unten verschoben
  145. //und der X-Wert wieder auf 0 gesetzt, damit die nächste Reihe
  146. //von vorne an durchgelaufen werden kann
  147. averageStartY1 += 20;
  148. averageStartX1 = 0;
  149. //
  150. if (averageStartY1 > (average.height-20))
  151. {
  152. averageStartX1 = average.width;
  153. gotAverage = true;
  154. }
  155. }
  156. updatePixels();
  157. weiter = false;
  158. }
  159. }
  160.  
  161. //Der Helligkeitswert wird auf eine der 4 Oktaven gemapt
  162. int findOctave(float brightnessOctave)
  163. {
  164. int octave = int(map(brightnessOctave, 0, 100, 1, 4));
  165. return octave;
  166. }
  167.  
  168. //Der Farbwert wird auf einen der 7 möglich Töne gemapt
  169. int selectTune(float farbeTune)
  170. {
  171. int newTune = int(map(farbeTune, 0, 100, 1, 7));
  172. return newTune;
  173. }
  174.  
  175. //Die Töne werden auf Halbtonschritte Entfernung vom Grundton umgeschrieben
  176. int schrittTune(int tempHue)
  177. {
  178. if (tempHue == 1)
  179. {
  180. return 0;
  181. } else if (tempHue == 2)
  182. {
  183. return 2;
  184. } else if (tempHue == 3)
  185. {
  186. return 4;
  187. } else if (tempHue == 4)
  188. {
  189. return 5;
  190. } else if (tempHue == 5)
  191. {
  192. return 7;
  193. } else if (tempHue == 6)
  194. {
  195. return 9;
  196. } else if (tempHue == 7)
  197. {
  198. return 11;
  199. } else
  200. {
  201. return 0;
  202. }
  203. }
  204.  
  205. //Die Oktaven werden auf Halbtonschritte Entfernung vom Grundton umgeschrieben
  206. int schrittOctave(int tempBrightness)
  207. {
  208. if (tempBrightness == 1)
  209. {
  210. return 0;
  211. } else if (tempBrightness == 2)
  212. {
  213. return 12;
  214. } else if (tempBrightness == 3)
  215. {
  216. return 24;
  217. } else if (tempBrightness == 4)
  218. {
  219. return 36;
  220. } else {
  221. return 0;
  222. }
  223. }
  224.  
  225. void liveTrigger(int channel, int pitch)
  226. {
  227.  
  228.  
  229. for (int i =0; i < pixelList.size(); i++)
  230. {
  231. //Durch das Input Signal pitch wird der Rhythmus bestimmt, dabei steht jeder Pitch für einen anderen Rhythmus
  232. if (pixelList.get(i).getHelligkeit() <=2 && pitch == 55)
  233. {
  234. int tune = schrittTune(int(pixelList.get(i).getFarbe()));
  235. println(tune);
  236. int oktave=schrittOctave(int(pixelList.get(i).getHelligkeit()));
  237. println(oktave);
  238. //Der Ton welcher an Live gesendet wird. Zusammengesetzt aus Grundton + Oktave plus Abstand vom Grundton innerhalb der Tonart, hier GisDur
  239. int ton = 32+tune+oktave;
  240. myBus.sendNoteOn(0, ton, 127);
  241. weiter = true;
  242. }
  243. }
  244.  
  245.  
  246.  
  247. for (int i =0; i < pixelList.size(); i++)
  248. {
  249. if (pixelList.get(i).getHelligkeit() >=3 && pitch == 62)
  250. {
  251. int oktave = schrittOctave(int(pixelList.get(i).getHelligkeit()));
  252. int tune = schrittTune(int(pixelList.get(i).getFarbe()));
  253. int ton = 32+tune+oktave;
  254. myBus.sendNoteOn(0, ton, 127);
  255. if (pitch >= 0)
  256. weiter = true;
  257. }
  258. }
  259. }
  260.  
  261. //themidiBus Speziefischer Inhalt
  262.  
  263.  
  264.  
  265.  
  266. void noteOn(int channel, int pitch, int velocity) {
  267. // Receive a noteOn
  268. // println();
  269. //println("Note On:");
  270. // println("--------");
  271. // println("Channel:"+channel);
  272. // println("Pitch:"+pitch);
  273. //println("Velocity:"+velocity);
  274.  
  275. liveTrigger(channel, pitch);
  276. }
  277.  
  278. void noteOff(int channel, int pitch, int velocity) {
  279. // Receive a noteOff
  280. //println();
  281. //println("Note Off:");
  282. //println("--------");
  283. //println("Channel:"+channel);
  284. //println("Pitch:"+pitch);
  285. //println("Velocity:"+velocity);
  286. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement