RockBot System

Vocals

Getting Started

This guide describes how to create a rock band vocal bot. A solderless version is available from the shops.


Tools you will need:
  • A Soldering Iron & Solder
  • A Multimeter
  • Wirecutters
  • A PIC Programmer suitable for a PIC16F877A chip

Components Used:

  • 1 x PIC16F877A
  • 4 x 1k Resistors
  • 1 x 20 Ohm Resistor
  • 1 x 2.5mm Stereo Headphone Jack
  • 1 x 8Mhz Crystal
  • 2 x 22pf Capacitors (Ceramic disc)

How the Vocals work

The vocals appear to use pitch recognition software/technology, which I have concluded both by experience and browsing the web. The main fact is you don't have to sing the words, you can just hum (or emmit general noise) at the correct pitch (note).

The Mic

The rock band mic is a standard USB Microphone made by logitech. You can sing to rock band via almost any USB mic it claims, however wouldn't it be much easier if you didn't need to rip apart a mic, or tape a speaker to it? Well it is that easy, as you can also sing through the 360 headset the vocal bot simply plays the correct tone via the 360 headset port using a 2.5mm stereo jack.

The PIC16F877A

PIC Chips are programmable microcontrollers made by a company called Microchip. A PIC16F877A is a complex 40 pin chip which in this project requires an 8 Mhz crystal for accuracy. A simpler chip can be used, but at the time this is all I had spare.

Microchip provide an IDE for writing the code for these chips (which I used for the Advanced USB Interface) but for the drums I used MikroBasic (the demo version is sufficient).

To program them a PIC Programmer is required, Microchip supply them as do the Mikroelectronica (the company that makes MikroBasic).

How to simulate the Vocals

The rockband vocals can cover a range of 45 frequencies, however you only have to sing the right note, not the right octave.

I programmed the chip to produce all 45 notes based on the inputs on PORTD, it used timings in micro seconds to turn PORTC on and off and intervals that corresponded with the note frequencies. The timings (and therefore not pitches) were then fine tuned using a guitar tuner.

The USB board controls PORTD telling it what note to play.

After experimentation I found a fixed range of notes worked best, so the software translates any notes that fall outside this range into the acceptable ones. This gave better accuracy.

 

Connecting Up

The tip and shell are audio-in lines, the middle and shell are for audio out (the ear piece) so, connet the output wires to shell and tip.

The shell connector will be the long one with the whole it and the grips, but you should use a multi meter to check which on the tip is. Check both to be sure.

Circuit Diagram

All schematics and PCB layouts are done using the free version of Eagle and the files are available for download at the bottom of this page.

JP1 is the output to the mic plug

R1, 3, 4 and 5 are 1K Resistor

R2 is a 20 Ohm Resistor

C1 and 2 are 22pf Capacitors

Q1 is an 8Mhz Crystal

CON1 is the header to the usb board carrying data and power.

PIC Code

Below is the MikroBasic Code:

program LED_Blinking

dim text as char[20]
  dim i as longint
  dim n as integer

main:
ANSEL  = 0                              ' configure AN pins as digital I/O
ANSELH = 0
PORTC = 0                 ' initialize PORTC
TRISD = 255
TRISC = 0                 ' configure PORTC as output
while TRUE
SELECT CASE PortD
  Case 1
    PORTC = not PORTC
    Delay_us(12084)
  Case 2
    PORTC = not PORTC
    Delay_us(11403)
  Case 3
    PORTC = not PORTC
    Delay_us(10761)
  Case 4
    PORTC = not PORTC
    Delay_us(10154)
  Case 5
    PORTC = not PORTC
    Delay_us(9581)
  Case 6
    PORTC = not PORTC
    Delay_us(9041)
  Case 7
    PORTC = not PORTC
    Delay_us(8531)
  Case 8
    PORTC = not PORTC
    Delay_us(8049)
  Case 9
    PORTC = not PORTC
    Delay_us(7595)
  Case 10
    PORTC = not PORTC
    Delay_us(7166)
  Case 11
    PORTC = not PORTC
    Delay_us(6761)
  Case 12
    PORTC = not PORTC
    Delay_us(6378)
  Case 13
    PORTC = not PORTC
    Delay_us(6018)
  Case 14
    PORTC = not PORTC
    Delay_us(5677)
  Case 15
    PORTC = not PORTC
    Delay_us(5355)
  Case 16
    PORTC = not PORTC
    Delay_us(5052)
  Case 17
    PORTC = not PORTC
    Delay_us(4766)
  Case 18
    PORTC = not PORTC
    Delay_us(4495)
  Case 19
    PORTC = not PORTC
    Delay_us(4230)
  Case 20
    PORTC = not PORTC
    Delay_us(4000)
  Case 21
    PORTC = not PORTC
    Delay_us(3772)
  Case 22
    PORTC = not PORTC
    Delay_us(3558)
  Case 23
    PORTC = not PORTC
    Delay_us(3355)
  Case 24
    PORTC = not PORTC
    Delay_us(3164)
  Case 25
    PORTC = not PORTC
    Delay_us(2984)
  Case 26
    PORTC = not PORTC
    Delay_us(2813)
  Case 27
    PORTC = not PORTC
    Delay_us(2653)
  Case 28
    PORTC = not PORTC
    Delay_us(2501)
  Case 29
    PORTC = not PORTC
    Delay_us(2358)
  Case 30
    PORTC = not PORTC
    Delay_us(2223)
  Case 31
    PORTC = not PORTC
    Delay_us(2095)
  Case 32
    PORTC = not PORTC
    Delay_us(1975)
  Case 33
    PORTC = not PORTC
    Delay_us(1861)
  Case 34
    PORTC = not PORTC
    Delay_us(1754)
  Case 35
    PORTC = not PORTC
    Delay_us(1653)
  Case 36
    PORTC = not PORTC
    Delay_us(1557)
  Case 37
    PORTC = not PORTC
    Delay_us(1467)
  Case 38
    PORTC = not PORTC
    Delay_us(1382)
  Case 39
    PORTC = not PORTC
    Delay_us(1301)
  Case 40
    PORTC = not PORTC
    Delay_us(1226)
  Case 41
    PORTC = not PORTC
    Delay_us(1154)
  Case 42
    PORTC = not PORTC
    Delay_us(1086)
  Case 43
    PORTC = not PORTC
    Delay_us(1023)
  Case 44
    PORTC = not PORTC
    Delay_us(962)
  Case 45
    PORTC = not PORTC
    Delay_us(906)
END SELECT
  wend
end.



Copyright © Paul Ridgway 2009 | Pictures by Amanda Taylor | HTML Layout & Base code by James Ridgway