/* Clock of notes that may be turned on. Ethan Kennerly There are two notes, at 1/16 and 2/16 of circle. If a note input is triggered and it is near a note, that note is toggled. Notice that if an object's data member does not have a new value, then GlovePIE does not execute that assignment again. Therefore, the if/else assignment of Midi.FirstNote to a new value is essential to play a second beat. */ if not var.initialized // STARTING CONFIGURATION // Search and replace "wiimote" with "wiimote2", "wiimote3", "wiimote4" "." // Replace Led1 with "Led2", "Led3", "Led4" wiimote3.Led3 = true // Station 1: Synchronize time to previous interval and play background. // For stations 2, 3, and 4, this is false. var.control_sync = false var.sound_color = 0xAAAA33 var.cursor_color = 0xFFFF00 var.pitch_color = 0xFFFFCC obj.colour = var.cursor_color var.midi = false if var.midi var.sound0 = 60 var.sound1 = 70 var.sound2 = 80 var.sound3 = 90 endif var.play_sound = true if var.play_sound var.sound0 = 'C:\wiimedialab\sound\Conga Percussion 16.wav' var.sound1 = 'C:\wiimedialab\sound\conga1.wav' var.sound2 = 'C:\wiimedialab\sound\conga5.wav' var.sound3 = 'C:\wiimedialab\sound\conga8.wav' endif var.say = false if var.say var.sound0 = 'bad not bad' var.sound1 = 'a is not a' var.sound2 = 'dada' var.sound3 = 'hello world' endif var.background_file = 'C:\wiimedialab\sound\Effected Beat 03.wav' var.background_file_time = 10 seconds var.sound0_size = 40 cm var.sound1_size = 30 cm var.sound2_size = 20 cm var.sound3_size = 10 cm var.selected_note = var.sound1 var.size = var.sound1_size // END OF STARTING CONFIGURATION var.initialized = true Midi.FirstNote = 0 var.note_now = -1 var.time = 1000.000 seconds var.loop_time = 0.0 seconds var.loop_time_min = 0.0 seconds var.interval_seconds = 2.0 seconds var.input_available_time = 0.0 seconds var.tempo = 1.0 var.direction = 1 cam.pos = [0.0,0.0,-3] m // Metronome cursor obj.CubeSize = var.size var.note_count = 8 var.note_time = var.interval_seconds / var.note_count var.margin_time = var.note_time / 2 var.background_time = 0.000 seconds var.background_repeat_time = 0.0 seconds // Initial note position // Note 0 var.note0 = false var.clock_time0 = (0 * var.note_time) var.clock_time0_min = (var.clock_time0 - var.margin_time) + var.interval_seconds var.clock_time0_max = (var.clock_time0 + var.margin_time) % var.interval_seconds obj2.CubeSize = 5 cm obj2.colour = 0x000000 var.clock_theta = 90.0 - var.clock_time0 * 360.0 / var.interval_seconds obj2.x = cos( var.clock_theta ) obj2.y = sin( var.clock_theta ) // Note 1 var.note1 = false var.clock_time1 = (1 * var.note_time) var.clock_time1_min = (var.clock_time1 - var.margin_time) % var.interval_seconds var.clock_time1_max = (var.clock_time1 + var.margin_time) % var.interval_seconds obj3.CubeSize = 5 cm obj3.colour = 0x000000 var.clock_theta = 90.0 - var.clock_time1 * 360.0 / var.interval_seconds obj3.x = cos( var.clock_theta ) obj3.y = sin( var.clock_theta ) // Note 2 var.note2 = false var.clock_time2 = (2 * var.note_time) var.clock_time2_min = (var.clock_time2 - var.margin_time) % var.interval_seconds var.clock_time2_max = (var.clock_time2 + var.margin_time) % var.interval_seconds obj4.CubeSize = 5 cm obj4.colour = 0x000000 var.clock_theta = 90.0 - var.clock_time2 * 360.0 / var.interval_seconds obj4.x = cos( var.clock_theta ) obj4.y = sin( var.clock_theta ) // Note 3 var.note3 = false var.clock_time3 = (3 * var.note_time) var.clock_time3_min = (var.clock_time3 - var.margin_time) % var.interval_seconds var.clock_time3_max = (var.clock_time3 + var.margin_time) % var.interval_seconds obj5.CubeSize = 5 cm obj5.colour = 0x000000 var.clock_theta = 90.0 - var.clock_time3 * 360.0 / var.interval_seconds obj5.x = cos( var.clock_theta ) obj5.y = sin( var.clock_theta ) // Note 4 var.note4 = false var.clock_time4 = (4 * var.note_time) var.clock_time4_min = (var.clock_time4 - var.margin_time) % var.interval_seconds var.clock_time4_max = (var.clock_time4 + var.margin_time) % var.interval_seconds obj6.CubeSize = 5 cm obj6.colour = 0x000000 var.clock_theta = 90.0 - var.clock_time4 * 360.0 / var.interval_seconds obj6.x = cos( var.clock_theta ) obj6.y = sin( var.clock_theta ) // Note 5 var.note5 = false var.clock_time5 = (5 * var.note_time) var.clock_time5_min = (var.clock_time5 - var.margin_time) % var.interval_seconds var.clock_time5_max = (var.clock_time5 + var.margin_time) % var.interval_seconds obj7.CubeSize = 5 cm obj7.colour = 0x000000 var.clock_theta = 90.0 - var.clock_time5 * 360.0 / var.interval_seconds obj7.x = cos( var.clock_theta ) obj7.y = sin( var.clock_theta ) // Note 6 var.note6 = false var.clock_time6 = (6 * var.note_time) var.clock_time6_min = (var.clock_time6 - var.margin_time) % var.interval_seconds var.clock_time6_max = (var.clock_time6 + var.margin_time) % var.interval_seconds obj8.CubeSize = 5 cm obj8.colour = 0x000000 var.clock_theta = 90.0 - var.clock_time6 * 360.0 / var.interval_seconds obj8.x = cos( var.clock_theta ) obj8.y = sin( var.clock_theta ) // Note 7 var.note7 = false var.clock_time7 = (7 * var.note_time) var.clock_time7_min = (var.clock_time7 - var.margin_time) % var.interval_seconds var.clock_time7_max = (var.clock_time7 + var.margin_time) % var.interval_seconds obj9.CubeSize = 5 cm obj9.colour = 0x000000 var.clock_theta = 90.0 - var.clock_time7 * 360.0 / var.interval_seconds obj9.x = cos( var.clock_theta ) obj9.y = sin( var.clock_theta ) endif // Update timers if 1 == var.direction var.time += PIE.FrameTime * var.tempo var.loop_time_min = var.loop_time var.loop_time = var.time % var.interval_seconds else var.time -= PIE.FrameTime * var.tempo var.loop_time = var.loop_time_min var.loop_time_min = var.time % var.interval_seconds endif // Update cursor position var.theta = 90.0 - var.loop_time * 360.0 / var.interval_seconds obj.x = cos( var.theta ) obj.y = sin( var.theta ) // Station 1: Synchronize time to previous interval if Pressed( Wiimote.One ) or Key.One var.time += var.interval_seconds var.time = int(var.time / var.interval_seconds) var.time = var.time * var.interval_seconds var.tempo = 1.0 // Reset background beat var.background_repeat_time = 0.0 seconds endif if var.control_sync // Station 1: Loop the background beat var.background_time += PIE.FrameTime if var.background_repeat_time <= var.background_time var.background_repeat_time += var.background_file_time PlaySound( var.background_file ) endif endif // Adjust tempo if Pressed( wiimote3.Minus ) or Pressed( Key.Minus ) if 0.0625 < var.tempo var.tempo *= 0.5 endif else if Pressed( wiimote3.Plus ) or Pressed( Key.Equals ) if var.tempo < 16.0 var.tempo *= 2.0 endif endif // Backward in time or forward if Pressed( wiimote3.B ) or Pressed( Key.B ) var.direction *= -1 endif // Increase pitch if Pressed( wiimote3.Up ) or Pressed( Key.Up ) if var.sound0 == var.selected_note var.selected_note = var.sound1 var.size = var.sound1_size else if var.sound1 == var.selected_note var.selected_note = var.sound2 var.size = var.sound2_size else if var.sound2 == var.selected_note var.selected_note = var.sound3 var.size = var.sound3_size else if var.sound3 == var.selected_note var.selected_note = var.sound0 var.size = var.sound0_size endif obj.CubeSize = var.size else if Pressed( wiimote3.Down ) or Pressed( Key.Down ) if var.sound0 == var.selected_note var.selected_note = var.sound3 var.size = var.sound3_size else if var.sound1 == var.selected_note var.selected_note = var.sound0 var.size = var.sound0_size else if var.sound2 == var.selected_note var.selected_note = var.sound1 var.size = var.sound1_size else if var.sound3 == var.selected_note var.selected_note = var.sound2 var.size = var.sound2_size endif obj.CubeSize = var.size endif // Vary pitch by wiimote pitch. if HeldDown(-3 m per s per s < Wiimote.RelAccY, 0.5 seconds) and HeldDown(Wiimote.RelAccY < 3 m per s per s, 0.5 seconds) if HeldDown(Wiimote.Pitch < 5, 0.1 seconds) var.selected_note = var.sound0 var.size = var.sound0_size else if HeldDown(Wiimote.Pitch < 20, 0.1 seconds) var.selected_note = var.sound1 var.size = var.sound1_size else if HeldDown(Wiimote.Pitch < 40, 0.1 seconds) var.selected_note = var.sound2 var.size = var.sound2_size else if HeldDown(Wiimote.Pitch < 60, 0.1 seconds) var.selected_note = var.sound3 var.size = var.sound3_size endif obj.colour = var.pitch_color obj.CubeSize = var.size else obj.colour = var.cursor_color endif // Vary tempo by roll if HeldDown(-3 m per s per s < Wiimote.RelAccY, 0.5 seconds) and HeldDown(Wiimote.RelAccY < 3 m per s per s, 0.5 seconds) if var.direction == 1 if HeldDown(Wiimote.Roll < -90, 0.1 seconds) var.tempo = 0.125 else if HeldDown(Wiimote.Roll < -40, 0.1 seconds) var.tempo = 0.25 else if HeldDown(Wiimote.Roll < -20, 0.1 seconds) var.tempo = 0.5 else if HeldDown(Wiimote.Roll < 50, 0.1 seconds) var.tempo = 1.0 else if HeldDown(Wiimote.Roll < 90, 0.1 seconds) var.tempo = 2.0 else //if HeldDown(Wiimote.Roll < 90, 0.1 seconds) var.tempo = 4.0 endif else if HeldDown(Wiimote.Roll < -90, 0.1 seconds) var.tempo = 4.0 else if HeldDown(Wiimote.Roll < -40, 0.1 seconds) var.tempo = 2.0 else if HeldDown(Wiimote.Roll < -20, 0.1 seconds) var.tempo = 1.0 else if HeldDown(Wiimote.Roll < 50, 0.1 seconds) var.tempo = 0.5 else if HeldDown(Wiimote.Roll < 80, 0.1 seconds) var.tempo = 0.25 else //if HeldDown(Wiimote.Roll < 90, 0.1 seconds) var.tempo = 0.125 endif endif obj.colour = var.pitch_color //debug = 'roll: ' + Wiimote.Roll else obj.colour = var.cursor_color endif // Intuitively toggle a note near cursor. if wiimote3.RelAccY >= 20 m per s per s or Pressed( wiimote3.A ) or Pressed( A ) if (var.direction == 1 and var.input_available_time <= var.time) or (var.direction == -1 and var.time <= var.input_available_time) // Disable note input for a little while to prevent double-input. var.input_available_time = var.time + (var.note_time * var.direction) // Place or delete a nearby note. if var.clock_time0_min <= var.loop_time or var.loop_time <= var.clock_time0_max if var.note0 == false then var.note0 = true obj2.CubeSize = var.size obj2.colour = var.sound_color var.selected_note0 = var.selected_note else var.note0 = false obj2.CubeSize = 5 cm obj2.colour = 0x000000 endif else if var.clock_time1_min <= var.loop_time and var.loop_time <= var.clock_time1_max if var.note1 == false then var.note1 = true obj3.CubeSize = var.size obj3.colour = var.sound_color var.selected_note1 = var.selected_note else var.note1 = false obj3.CubeSize = 5 cm obj3.colour = 0x000000 endif else if var.clock_time2_min <= var.loop_time and var.loop_time <= var.clock_time2_max if var.note2 == false then var.note2 = true obj4.CubeSize = var.size obj4.colour = var.sound_color var.selected_note2 = var.selected_note else var.note2 = false obj4.CubeSize = 5 cm obj4.colour = 0x000000 endif else if var.clock_time3_min <= var.loop_time and var.loop_time <= var.clock_time3_max if var.note3 == false then var.note3 = true obj5.CubeSize = var.size obj5.colour = var.sound_color var.selected_note3 = var.selected_note else var.note3 = false obj5.CubeSize = 5 cm obj5.colour = 0x000000 endif else if var.clock_time4_min <= var.loop_time and var.loop_time <= var.clock_time4_max if var.note4 == false then var.note4 = true obj6.CubeSize = var.size obj6.colour = var.sound_color var.selected_note4 = var.selected_note else var.note4 = false obj6.CubeSize = 5 cm obj6.colour = 0x000000 endif else if var.clock_time5_min <= var.loop_time and var.loop_time <= var.clock_time5_max if var.note5 == false then var.note5 = true obj7.CubeSize = var.size obj7.colour = var.sound_color var.selected_note5 = var.selected_note else var.note5 = false obj7.CubeSize = 5 cm obj7.colour = 0x000000 endif else if var.clock_time6_min <= var.loop_time and var.loop_time <= var.clock_time6_max if var.note6 == false then var.note6 = true obj8.CubeSize = var.size obj8.colour = var.sound_color var.selected_note6 = var.selected_note else var.note6 = false obj8.CubeSize = 5 cm obj8.colour = 0x000000 endif else if var.clock_time7_min <= var.loop_time and var.loop_time <= var.clock_time7_max if var.note7 == false then var.note7 = true obj9.CubeSize = var.size obj9.colour = var.sound_color var.selected_note7 = var.selected_note else var.note7 = false obj9.CubeSize = 5 cm obj9.colour = 0x000000 endif endif endif endif // Play the next note in the loop. if var.note0 and var.loop_time < var.loop_time_min and var.clock_time0 <= var.loop_time var.note_now = 0 else if var.note1 and var.loop_time_min < var.clock_time1 <= var.loop_time var.note_now = 1 else if var.note2 and var.loop_time_min < var.clock_time2 <= var.loop_time var.note_now = 2 else if var.note3 and var.loop_time_min < var.clock_time3 <= var.loop_time var.note_now = 3 else if var.note4 and var.loop_time_min < var.clock_time4 <= var.loop_time var.note_now = 4 else if var.note5 and var.loop_time_min < var.clock_time5 <= var.loop_time var.note_now = 5 else if var.note6 and var.loop_time_min < var.clock_time6 <= var.loop_time var.note_now = 6 else if var.note7 and var.loop_time_min < var.clock_time7 <= var.loop_time var.note_now = 7 endif // SOUND // Play a sound of some sort if 0 <= var.note_now // Midi? if var.midi Midi.FirstNote = 0 if 0 == var.note_now Midi.FirstNote = var.selected_note0 else if 1 == var.note_now Midi.FirstNote = var.selected_note1 else if 2 == var.note_now Midi.FirstNote = var.selected_note2 else if 3 == var.note_now Midi.FirstNote = var.selected_note3 else if 4 == var.note_now Midi.FirstNote = var.selected_note4 else if 5 == var.note_now Midi.FirstNote = var.selected_note5 else if 6 == var.note_now Midi.FirstNote = var.selected_note6 else if 7 == var.note_now Midi.FirstNote = var.selected_note7 endif endif // Sound file? if var.play_sound if 0 == var.note_now PlaySound( var.selected_note0 ) else if 1 == var.note_now PlaySound( var.selected_note1 ) else if 2 == var.note_now PlaySound( var.selected_note2 ) else if 3 == var.note_now PlaySound( var.selected_note3 ) else if 4 == var.note_now PlaySound( var.selected_note4 ) else if 5 == var.note_now PlaySound( var.selected_note5 ) else if 6 == var.note_now PlaySound( var.selected_note6 ) else if 7 == var.note_now PlaySound( var.selected_note7 ) endif endif // Text to speech? if var.say if 0 == var.note_now Say( var.selected_note0 ) else if 1 == var.note_now Say( var.selected_note1 ) else if 2 == var.note_now Say( var.selected_note2 ) else if 3 == var.note_now Say( var.selected_note3 ) else if 4 == var.note_now Say( var.selected_note4 ) else if 5 == var.note_now Say( var.selected_note5 ) else if 6 == var.note_now Say( var.selected_note6 ) else if 7 == var.note_now Say( var.selected_note7 ) endif endif var.note_now = -1 endif // Monitor what may wrong with the application. //debug = 'selected note: ' + var.selected_note + ' now: ' + var.note_now //debug = ' available: ' + var.input_available_time + ' time: ' + var.time + ' note_time: ' + var.note_time //debug = ' time: ' + var.time + ' theta: ' + var.theta + ' min: ' + var.loop_time_min + ' loop: ' + var.loop_time + ' n1: ' + var.note1 + ' c1: ' + var.clock_time1 //debug = ' min: ' + var.loop_time_min + ' loop: ' + var.loop_time + ' c0: ' + var.clock_time0_min + ' c max: ' + var.clock_time0_max //debug += ' theta: ' + var.theta + ' available: ' + var.input_available_time // debug = ' min: ' + var.clock_time2_min + ' loop: ' + var.loop_time + ' max: ' + var.clock_time2_max