Shop OBEX P1 Docs P2 Docs Learn Events
VMusic3 — Parallax Forums

VMusic3

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

Comments

  • T ChapT Chap Posts: 4,198
    edited 2016-05-22 01:03
    I went through a period of using Vmusic2 schematics on my own boards. The basic experience on this forum and my experience too is that the SD CARD + FAT engines floating around here are a better way to go than Vinculum. You can create decent audio from wav files with no DAC, using the Prop pins, a cap and resistor only. If you want to get fancier there are various DACs you can use for wav files. For MP3 of course you must have a decoder like the Vmusic2/3 etc.

    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++
    
    
    
    
  • Hello T Chap,

    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
  • You don't really need a driver. I posted plenty of code that should do the job, I have not looked at the commands for the 3 but assume they are similar. There is a little bit of a learning curve so you have to just dive in, try some stuff then post questions and code to get it going. What you are wanting it not difficult.

    Do you already have a Prop board?
  • I only used my old VMusic2 with a BS2P40 stamp for datalogging, but if you search the forums for "VMusic2", there are lots of threads with good insight.

    My favorite VMusic2 project is the one you mentioned from Ron Czapala.

  • csamson wrote: »
    Hello T Chap,

    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

    If you check towards the bottom of Ron's thread, locate the ZIP files that have the files in it.

  • Chris SavageChris Savage Parallax Engineering Posts: 14,406
    Bruce,

    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.
  • Chris SavageChris Savage Parallax Engineering Posts: 14,406
    The VMusic3 came in, so as soon as I get some time to work on it I will create an object for it as well as some sample BS2 code.
  • Hello Chris,

    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
  • Chris SavageChris Savage Parallax Engineering Posts: 14,406
    Yeah, I will be working on it soon. =)
Sign In or Register to comment.