VMusic3
in Propeller 1
Hello I am looking for anyone that might have used a FTDI VMusic3 or VMusic2 with a Proppeller Chip?
Looks like you can talk to it with Serial Just looking for someone that might use this FTDI MP3 and Wav file player.
Thanks,
Bruce
Looks like you can talk to it with Serial Just looking for someone that might use this FTDI MP3 and Wav file player.
Thanks,
Bruce

Comments
Here is an example of a voice prompt system where you tell the method a number and the USB stick has a lot of files of voice recordings saying numbers 0,1,2 100, etc which allowed human voice playback of numbers. I added a bunch of other examples. All you need is to use some serial object, set it to the baud, pins, etc. I use 4port versions always which you will notice looks slightly different from the standard full duplex commands as it needs the port number. Maybe this should get you going. If you want to use one of the single full duplex engines found in OBX, just remove the "2" found in all my commands which specifies the port in a 4 port engine.
PS there are likely some Vmusic drivers in OBX.
PUB SayNumber(num) | x, y, z 'will not say '0' ??? Silence VolUP x := (num/100) * 100 y := ((num/10) // 10) * 10 z := num // 10 If (y+z) > 9 AND (y+z) < 20 z := y + z y := 0 if x > 0 Silence VolUp speak(x) waitcnt(40_000_000 + cnt) if y > 0 Silence VolUp speak(y) waitcnt(40_000_000 + cnt) if z == 0 if x == 0 AND y == 0 Silence VolUp speak(z) if z > 0 Silence VolUp speak(z) PUB Speak(n) case n 0 : ser.str(2, string("VPF 0.mp3", CR)) waitcnt(40_000_000 + cnt) 1 : ser.str(2, string("VPF 1.mp3", CR)) waitcnt(40_000_000 + cnt) 2 : ser.str(2, string("VPF 2.mp3", CR)) waitcnt(40_000_000 + cnt) 3 : ser.str(2, string("VPF 3.mp3", CR)) waitcnt(40_000_000 + cnt) 4 : ser.str(2, string("VPF 4.mp3", CR)) waitcnt(40_000_000 + cnt) 5 : ser.str(2, string("VPF 5.mp3", CR)) waitcnt(40_000_000 + cnt) 6 : ser.str(2, string("VPF 6.mp3", CR)) waitcnt(40_000_000 + cnt) 7 : ser.str(2, string("VPF 7.mp3", CR)) waitcnt(40_000_000 + cnt) 8 : ser.str(2, string("VPF 8.mp3", CR)) waitcnt(40_000_000 + cnt) 9 : ser.str(2, string("VPF 9.mp3", CR)) waitcnt(40_000_000 + cnt) 10 : ser.str(2, string("VPF 10.mp3", CR)) waitcnt(40_000_000 + cnt) 11 : ser.str(2, string("VPF 11.mp3", CR)) waitcnt(40_000_000 + cnt) 12 : ser.str(2, string("VPF 12.mp3", CR)) waitcnt(40_000_000 + cnt) 13 : ser.str(2, string("VPF 13.mp3", CR)) waitcnt(40_000_000 + cnt) 14 : ser.str(2, string("VPF 14.mp3", CR)) waitcnt(40_000_000 + cnt) 15 : ser.str(2, string("VPF 15.mp3", CR)) waitcnt(40_000_000 + cnt) 16 : ser.str(2, string("VPF 16.mp3", CR)) waitcnt(40_000_000 + cnt) 17 : ser.str(2, string("VPF 17.mp3", CR)) waitcnt(40_000_000 + cnt) 18 : ser.str(2, string("VPF 18.mp3", CR)) waitcnt(40_000_000 + cnt) 19 : ser.str(2, string("VPF 19.mp3", CR)) waitcnt(40_000_000 + cnt) 20 : ser.str(2, string("VPF 20.mp3", CR)) waitcnt(40_000_000 + cnt) 30 : ser.str(2, string("VPF 30.mp3", CR)) waitcnt(40_000_000 + cnt) 40 : ser.str(2, string("VPF 40.mp3", CR)) waitcnt(40_000_000 + cnt) 50 : ser.str(2, string("VPF 50.mp3", CR)) waitcnt(40_000_000 + cnt) 60 : ser.str(2, string("VPF 60.mp3", CR)) waitcnt(40_000_000 + cnt) 70 : ser.str(2, string("VPF 70.mp3", CR)) waitcnt(40_000_000 + cnt) 80 : ser.str(2, string("VPF 80.mp3", CR)) waitcnt(40_000_000 + cnt) 90 : ser.str(2, string("VPF 90.mp3", CR)) waitcnt(40_000_000 + cnt) 100 : ser.str(2, string("VPF 100.mp3", CR)) waitcnt(40_000_000 + cnt) 200 : ser.str(2, string("VPF 200.mp3", CR)) waitcnt(40_000_000 + cnt) 300 : ser.str(2, string("VPF 300.mp3", CR)) waitcnt(40_000_000 + cnt) 400 : ser.str(2, string("VPF 400.mp3", CR)) waitcnt(40_000_000 + cnt) 500 : ser.str(2, string("VPF 500.mp3", CR)) waitcnt(40_000_000 + cnt) 600 : ser.str(2, string("VPF 600.mp3", CR)) waitcnt(40_000_000 + cnt) 700 : ser.str(2, string("VPF 700.mp3", CR)) waitcnt(40_000_000 + cnt) 800 : ser.str(2, string("VPF 800.mp3", CR)) waitcnt(40_000_000 + cnt) 900 : ser.str(2, string("VPF 900.mp3", CR)) waitcnt(40_000_000 + cnt) 1000 : ser.str(2, string("VPF 1000.mp3", CR)) waitcnt(40_000_000 + cnt) PUB Silence ' avoid pops Mute 'change to fast fade vol off, might be smoother Vstop Reset PUB VolUp ser.str(2, string("VWR")) ser.tx(2, $20) ser.tx(2, $0B) ser.tx(2, VoiceVol) 'left ser.tx(2, VoiceVol) 'right or vice versa? ser.tx(2, $0D) PUB VStop ser.str(2, string("VST", CR)) ser.tx(2, $0D) PUB Mute ser.str(2, string("VWR")) ser.tx(2, $20) ser.tx(2, $0B) ser.tx(2, $FE) 'left ser.tx(2, $FE) 'right or vice versa? ser.tx(2, $0D) PUB Reset 'stop playing audio ser.str(2, string("VWR")) ser.tx(2, $20) ser.tx(2, $00) ser.tx(2, ResetMode) ser.tx(2, ResetMode >> 8) 'jump out of wave decode ser.tx(2, $0D) PUB OpenFile(filename) ser.str(2, string("OPR")) ser.tx(2, $20) ser.str(2, filename) ser.tx(2, $0D) PUB CloseFile(cfname) ser.str(2, string("CLF")) ser.tx(2, $20) ser.str(2, cfname) ser.tx(2, $0D) PUB ReadFile(readlen) rd4 := readlen >> 24 rd3 := readlen >> 16 rd2 := readlen >> 8 rd1 := readlen ser.str(2, string("RDF")) ser.tx(2,$20) ser.tx(2,rd4) ser.tx(2,rd3) ser.tx(2,rd2) ser.tx(2,rd1) ser.tx(2,$0D) Pub Seek(s) 'seek to a specific location within an already open for read file sekval := s 'sekval is long, destination to seek for read start go(0,0) ser.hex(3, sekval, 4) sek4 := sekval >> 24 sek3 := sekval >> 16 sek2 := sekval >> 8 sek1 := sekval ser.str(2, string("SEK")) ser.tx(2,$20) ser.tx(2,sek4) ser.tx(2,sek3) ser.tx(2,sek2) ser.tx(2,sek1) ser.tx(2,$0D) PUB OpenFileToWrite(filename) 'open or create file 'ser.str(2, string("OPW")) ser.tx(2, $4F) 'O ser.tx(2, $50) 'P ser.tx(2, $57) 'W ser.tx(2, $20) ser.str(2, filename) ser.tx(2, $0D) PUB WriteFileSize(size) '4 bytes specifies size of data to follow in WriteData wr4 := size >> 24 wr3 := size >> 16 wr2 := size >> 8 wr1 := size ser.str(2, string("WRF")) ser.tx(2,$20) ser.tx(2,wr4) ser.tx(2,wr3) ser.tx(2,wr2) ser.tx(2,wr1) ser.tx(2,$0D) PUB WriteData(size, pointer) | g, o 'send the data part of WriteFile g := 0 repeat size 'ser.tx(2, testbyte[g]) ser.tx(2, byte[pointer][g]) g++ ser.tx(2,$0D) PUB readusb(size) | m, v, t, check t := 0 w(500_000) 'delay required else usb hangs m := 0 Repeat until t == size '<<<<<warning flag leave at 64 v := ser.rxtime(2, 200) ' (z, 100) 'read more, port 0, wait 2 ms if no byte If v == -1 Return -1 ResponseArray1[m] := v m++ t++ if check < 54 'detect/remove previous vinculum response left overs if below first 54 bytes if ResponseArray1[m - 3] == $5C 'vinc left over info string if ResponseArray1[m - 2] == $3E 'vinc left over info string if ResponseArray1[m - 1] == $0D 'vinc left over info string m := 0 'reset all if old string rec'd t := 0 'reset all if old string rec'd check := 0 'reset all if old string rec'd 'w(100000) check++Thanks so much for your info. I will have to look though this see if I can understand it.
I have bought the VMusic3 already and thought it would work go for my project but maybe it won't. I thought it might play better music output with it this way.
I could not find any drivers in the OBX for the VMusic2 or VMusic3.
I did see something that Ron Czapala posted: http://forums.parallax.com/discussion/135033/ir-remote-controlled-vmusic2-mp3-player
but I could not find any drivers or examples.
I am new to this post and have not posted much so may not know how to find items yet.
Thanks again for you info and help!
Bruce
Do you already have a Prop board?
My favorite VMusic2 project is the one you mentioned from Ron Czapala.
If you check towards the bottom of Ron's thread, locate the ZIP files that have the files in it.
If I can get my hands on a VMusic3 I will write some code for it. Just have to order one I guess. I gave away both of my VMusic2 modules in TFOTTPB on my website a couple of years ago so I don't even have those as an example.
I am excited to here that you got a VMusic3 and are going to look at creating an object for it. I have tried myself and I have not got it to do anything. So I am excited to see how to do it.
Thanks,
Bruce