/src/com/sun/media/sound/ModelStandardIndexedDirector.java

https://gitlab.com/borneywpf/openjdk-7-src · Java · 186 lines · 145 code · 10 blank · 31 comment · 48 complexity · 1e5c36a1a0729925ab7f3632cf6df1b6 MD5 · raw file

  1. /*
  2. * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
  3. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4. *
  5. * This code is free software; you can redistribute it and/or modify it
  6. * under the terms of the GNU General Public License version 2 only, as
  7. * published by the Free Software Foundation. Oracle designates this
  8. * particular file as subject to the "Classpath" exception as provided
  9. * by Oracle in the LICENSE file that accompanied this code.
  10. *
  11. * This code is distributed in the hope that it will be useful, but WITHOUT
  12. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  14. * version 2 for more details (a copy is included in the LICENSE file that
  15. * accompanied this code).
  16. *
  17. * You should have received a copy of the GNU General Public License version
  18. * 2 along with this work; if not, write to the Free Software Foundation,
  19. * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20. *
  21. * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22. * or visit www.oracle.com if you need additional information or have any
  23. * questions.
  24. */
  25. package com.sun.media.sound;
  26. /**
  27. * A standard indexed director who chooses performers
  28. * by there keyfrom,keyto,velfrom,velto properties.
  29. *
  30. * @author Karl Helgason
  31. */
  32. public final class ModelStandardIndexedDirector implements ModelDirector {
  33. ModelPerformer[] performers;
  34. ModelDirectedPlayer player;
  35. boolean noteOnUsed = false;
  36. boolean noteOffUsed = false;
  37. // Variables needed for index
  38. byte[][] trantables;
  39. int[] counters;
  40. int[][] mat;
  41. public ModelStandardIndexedDirector(ModelPerformer[] performers,
  42. ModelDirectedPlayer player) {
  43. this.performers = performers;
  44. this.player = player;
  45. for (int i = 0; i < performers.length; i++) {
  46. ModelPerformer p = performers[i];
  47. if (p.isReleaseTriggered()) {
  48. noteOffUsed = true;
  49. } else {
  50. noteOnUsed = true;
  51. }
  52. }
  53. buildindex();
  54. }
  55. private int[] lookupIndex(int x, int y) {
  56. if ((x >= 0) && (x < 128) && (y >= 0) && (y < 128)) {
  57. int xt = trantables[0][x];
  58. int yt = trantables[1][y];
  59. if (xt != -1 && yt != -1) {
  60. return mat[xt + yt * counters[0]];
  61. }
  62. }
  63. return null;
  64. }
  65. private int restrict(int value) {
  66. if(value < 0) return 0;
  67. if(value > 127) return 127;
  68. return value;
  69. }
  70. private void buildindex() {
  71. trantables = new byte[2][129];
  72. counters = new int[trantables.length];
  73. for (ModelPerformer performer : performers) {
  74. int keyFrom = performer.getKeyFrom();
  75. int keyTo = performer.getKeyTo();
  76. int velFrom = performer.getVelFrom();
  77. int velTo = performer.getVelTo();
  78. if (keyFrom > keyTo) continue;
  79. if (velFrom > velTo) continue;
  80. keyFrom = restrict(keyFrom);
  81. keyTo = restrict(keyTo);
  82. velFrom = restrict(velFrom);
  83. velTo = restrict(velTo);
  84. trantables[0][keyFrom] = 1;
  85. trantables[0][keyTo + 1] = 1;
  86. trantables[1][velFrom] = 1;
  87. trantables[1][velTo + 1] = 1;
  88. }
  89. for (int d = 0; d < trantables.length; d++) {
  90. byte[] trantable = trantables[d];
  91. int transize = trantable.length;
  92. for (int i = transize - 1; i >= 0; i--) {
  93. if (trantable[i] == 1) {
  94. trantable[i] = -1;
  95. break;
  96. }
  97. trantable[i] = -1;
  98. }
  99. int counter = -1;
  100. for (int i = 0; i < transize; i++) {
  101. if (trantable[i] != 0) {
  102. counter++;
  103. if (trantable[i] == -1)
  104. break;
  105. }
  106. trantable[i] = (byte) counter;
  107. }
  108. counters[d] = counter;
  109. }
  110. mat = new int[counters[0] * counters[1]][];
  111. int ix = 0;
  112. for (ModelPerformer performer : performers) {
  113. int keyFrom = performer.getKeyFrom();
  114. int keyTo = performer.getKeyTo();
  115. int velFrom = performer.getVelFrom();
  116. int velTo = performer.getVelTo();
  117. if (keyFrom > keyTo) continue;
  118. if (velFrom > velTo) continue;
  119. keyFrom = restrict(keyFrom);
  120. keyTo = restrict(keyTo);
  121. velFrom = restrict(velFrom);
  122. velTo = restrict(velTo);
  123. int x_from = trantables[0][keyFrom];
  124. int x_to = trantables[0][keyTo + 1];
  125. int y_from = trantables[1][velFrom];
  126. int y_to = trantables[1][velTo + 1];
  127. if (x_to == -1)
  128. x_to = counters[0];
  129. if (y_to == -1)
  130. y_to = counters[1];
  131. for (int y = y_from; y < y_to; y++) {
  132. int i = x_from + y * counters[0];
  133. for (int x = x_from; x < x_to; x++) {
  134. int[] mprev = mat[i];
  135. if (mprev == null) {
  136. mat[i] = new int[] { ix };
  137. } else {
  138. int[] mnew = new int[mprev.length + 1];
  139. mnew[mnew.length - 1] = ix;
  140. for (int k = 0; k < mprev.length; k++)
  141. mnew[k] = mprev[k];
  142. mat[i] = mnew;
  143. }
  144. i++;
  145. }
  146. }
  147. ix++;
  148. }
  149. }
  150. public void close() {
  151. }
  152. public void noteOff(int noteNumber, int velocity) {
  153. if (!noteOffUsed)
  154. return;
  155. int[] plist = lookupIndex(noteNumber, velocity);
  156. if(plist == null) return;
  157. for (int i : plist) {
  158. ModelPerformer p = performers[i];
  159. if (p.isReleaseTriggered()) {
  160. player.play(i, null);
  161. }
  162. }
  163. }
  164. public void noteOn(int noteNumber, int velocity) {
  165. if (!noteOnUsed)
  166. return;
  167. int[] plist = lookupIndex(noteNumber, velocity);
  168. if(plist == null) return;
  169. for (int i : plist) {
  170. ModelPerformer p = performers[i];
  171. if (!p.isReleaseTriggered()) {
  172. player.play(i, null);
  173. }
  174. }
  175. }
  176. }