sequencer.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <template>
  2. <section class="sequencer" v-on:mouseover="displayControls()" v-on:mouseleave="hideControls()" >
  3. <div class="sequencerLine">
  4. <div class="slot-wrapper">
  5. <div class="slot" v-for="i in slotSlider" :key='i' >
  6. <beat v-if="euclideanList[i] === 1"></beat>
  7. <div v-else class="activeSlot"></div>
  8. </div>
  9. </div>
  10. </div>
  11. <div>
  12. <div class="control-menu" :class="[{'displayControls': controlIsDisplayed}]">
  13. <range-slider class="slider" min="1" :max="maxSlots" step="1" v-model="slotSlider" v-on:input="assignEuclidean(slotSlider, pulseSlider)" ></range-slider>
  14. <input id="pulseSlider" v-model="maxSlots" />
  15. <range-slider class="slider" min="1" :max="slotSlider" step="1" v-model="pulseSlider" v-on:input ="assignEuclidean(slotSlider, pulseSlider)" ></range-slider>
  16. <input id="pulseSlider" value="3" v-model="assignBeat" />
  17. </div>
  18. <!---
  19. <div style="background-color:firebrick">
  20. <input type="range" class="slider" min="1" max="32" step="1" v-model="slotSlider" v-on:change="assignEuclidean(slotSlider, pulseSlider)" />
  21. <input type="range" class="slider" min="1" :max="slotSlider" step="1" v-model="pulseSlider" v-on:change="assignEuclidean(slotSlider, pulseSlider)" />
  22. </div>
  23. -->
  24. </div>
  25. </section>
  26. </template>
  27. <script>
  28. import RangeSlider from 'vue-range-slider'
  29. // you probably need to import built-in style
  30. import 'vue-range-slider/dist/vue-range-slider.css'
  31. import beat from '~/components/beat.vue'
  32. export default {
  33. data() {
  34. return{
  35. slotSlider: 16,
  36. pulseSlider: 3,
  37. euclideanList:[],
  38. controlIsDisplayed:false
  39. }
  40. },
  41. components: {
  42. RangeSlider,
  43. beat
  44. },
  45. methods: {
  46. displayControls: function (){
  47. this.controlIsDisplayed = true;
  48. },
  49. hideControls: function (){
  50. this.controlIsDisplayed = false;
  51. },
  52. bjorklund: function (slots, pulses) {
  53. var pattern = [],
  54. count = [],
  55. remainder = [pulses],
  56. divisor = slots - pulses,
  57. level = 0,
  58. build_pattern = function(lv) {
  59. if (lv == -1) {
  60. pattern.push(0);
  61. } else if (lv == -2) {
  62. pattern.push(1);
  63. } else {
  64. for (var x = 0; x < count[lv]; x++) {
  65. build_pattern(lv - 1);
  66. }
  67. if (remainder[lv]) {
  68. build_pattern(lv - 2);
  69. }
  70. }
  71. }
  72. while (remainder[level] > 1) {
  73. count.push(Math.floor(divisor / remainder[level]));
  74. remainder.push(divisor % remainder[level]);
  75. divisor = remainder[level];
  76. level++;
  77. }
  78. count.push(divisor);
  79. build_pattern(level);
  80. return pattern.reverse();},
  81. assignEuclidean: function (a,b) {
  82. this.euclideanList = this.bjorklund(a,b);
  83. console.log(this.euclideanList);
  84. }
  85. }
  86. }
  87. </script>
  88. <style>
  89. .container {
  90. min-height: 100vh;
  91. display: flex;
  92. justify-content: center;
  93. align-items: center;
  94. text-align: center;
  95. }
  96. .title {
  97. font-family: "Quicksand", "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; /* 1 */
  98. display: block;
  99. font-weight: 300;
  100. font-size: 100px;
  101. color: #35495e;
  102. letter-spacing: 1px;
  103. }
  104. .subtitle {
  105. font-weight: 300;
  106. font-size: 42px;
  107. color: #526488;
  108. word-spacing: 5px;
  109. padding-bottom: 15px;
  110. }
  111. .links {
  112. padding-top: 15px;
  113. }
  114. .active{
  115. background-color:black;
  116. width:100%;
  117. height:40%
  118. }
  119. .control-menu{
  120. display: none;
  121. }
  122. .slider{
  123. width:30%;
  124. }
  125. .displayControls{
  126. display:flex !important;
  127. }
  128. .slot-wrapper{
  129. display:flex;
  130. height:3em;
  131. width:auto;
  132. background-color:firebrick;
  133. }
  134. .slot{
  135. flex:1 1 auto;
  136. background-color:beige;
  137. border-left:1pt solid aquamarine;
  138. border-right:1pt solid aquamarine;
  139. border-top: transparent !important;
  140. border-bottom: transparent !important;
  141. }
  142. .activeSlot{
  143. flex:1 1 auto;
  144. display: flex;
  145. flex-direction: column;
  146. }
  147. </style>