Code optimization
  • cerbellum
    member
    Posts: 27
    Joined: Sun May 07, 2006 3:59 pm
    Location: Antwerp, Belgium

    Code optimization

    by cerbellum » Sun Apr 15, 2007 5:34 pm

    Hi guys,

    A couple of months ago I started working on the WiiM8 (http://www.ramdac.be - forum thread). I finally found some time to improve it and add more options like controlling color, scale, ... with the Wii-remote, another big improvement is the addition of value smoothing as the original version was very "twitchy".

    At the moment I'm looking into the back-end of the module in Xcode and optimization of my python code in the module as I believe this could be achieved with much less code.

    Here's a part of my PeriodicalEvent code

    Code: Select all

          x = txt[0]
          x = float(x)
          
          #x signal smoothing
          listx.append(x)
          if len(listx) == 4:
             del listx[0]
          x = (listx[0]+2*listx[1] + listx[2])/4

          #visualize value
          module.setValue ('accX',0,x)
          
          #mode selection
          if mode == 'rotate':
             x -= x0
             x = x/xdiv
             x = asin(x)
             x = degrees(x)
             module.setValue ('degX',0,x)
             modul8.setValue ('direct_layer_rotation_z',x,0)
          elif mode == 'colorize':
             x -= x0
             x = x/xdiv
             x = asin(x)
             modul8.setValue ('direct_layer_color_additiveR',x,0)
          elif mode == 'scale':
             x -= x0
             x = x/xdiv
             x = asin(x)
             modul8.setValue ('direct_layer_scale_x',x,0)

    I think this part is actually quite OK, the matter is that I've copied this part 3 times, for the X, Y and Z values of the 3-axis accelerometers. I believe this could be achieved much easier using 'def' so I can define 1 function to use for the X, Y, Z values but this is where it usually goes wrong.

    Any help on defining this function would be greatly appreciated.

    Here's the full PeriodicalEvent code:

    Code: Select all

    count += elapsed

    if calc == 'done'   :
       if count >= 0.04 : #25fps
          count = 0.0
          resetvalues()
                
          x = txt[0]
          x = float(x)
          
          #x signal smoothing
          listx.append(x)
          if len(listx) == 4:
             del listx[0]
          x = (listx[0]+2*listx[1] + listx[2])/4

          #visualize value
          module.setValue ('accX',0,x)
          
          #mode selection
          if mode == 'rotate':
             x -= x0
             x = x/xdiv
             x = asin(x)
             x = degrees(x)
             module.setValue ('degX',0,x)
             modul8.setValue ('direct_layer_rotation_z',x,0)
          elif mode == 'colorize':
             x -= x0
             x = x/xdiv
             x = asin(x)
             modul8.setValue ('direct_layer_color_additiveR',x,0)
          elif mode == 'scale':
             x -= x0
             x = x/xdiv
             x = asin(x)
             modul8.setValue ('direct_layer_scale_x',x,0)
             
          y = txt[1]
          y = float(y)
          
          #y signal smoothing
          listy.append(y)
          if len(listy) == 4:
             del listy[0]
          y = (listy[0]+2*listy[1] + listy[2])/4
          
          #visualize value
          module.setValue ('accY',0,y)

          #mode selection
          if mode == 'rotate':
             y -= y0
             y = y/ydiv
             y = asin(y)
             y = degrees(y)
             module.setValue ('degY',0,y)
             modul8.setValue ('direct_layer_rotation_x',y,0)
          elif mode == 'colorize':
             y -= y0
             y = y/ydiv
             y = asin(y)
             modul8.setValue ('direct_layer_color_additiveG',y,0)
          elif mode == 'scale':
             y -= y0
             y = y/ydiv
             y = asin(y)
             modul8.setValue ('direct_layer_scale_y',y,0)

          
          z = txt[2]
          z = float(z)
          
          #z signal smoothing
          listz.append(z)      
          if len(listz) == 4:
             del listz[0]
          z = (listz[0]+2*listz[1] + listz[2])/4
          
          #visualize value
          module.setValue ('accZ',0,z)
          
          #mode selection
          if mode == 'rotate':
             z -= z0
             z = z/zdiv
             z = asin(z)
             z = degrees(z)
             module.setValue ('degZ',0,z)
             modul8.setValue ('direct_layer_rotation_z',z,0)
          elif mode == 'colorize':
             z -= z0
             z = z/zdiv
             z = asin(z)
             modul8.setValue ('direct_layer_color_additiveB',z,0)
          elif mode == 'scale':
             z -= z0
             z = z/zdiv
             z = asin(z)
             modul8.setValue ('direct_layer_scale_z',z,0)


    Thanks in advance,

    Kevin
  • Lupin
    garageCube team
    Posts: 383
    Joined: Fri Aug 18, 2006 12:37 pm
    Location: France
    Contact:

    by Lupin » Mon Apr 16, 2007 7:34 pm

    tu peux utiliser un script qui va evaluer x y et z au sein d'une fonction: voici le principe de base

    Code: Select all

    # considérons 3 modules de barre , 'barx', 'bary', 'barz' avec comme valeurs assignables un float allant de 0.0 à 5.0

    x0 = 5
    y0 = 3
    z0 = 1.5

    paramlist=['x','y','z'] # listes des paramètres à optimiser

    #definition de la fonction qui évalue les objets selon la liste de paramètres
    def test ():
       for i in paramlist:
          tempval=  eval(i+'0') # évaluation de respectivement x0,y0 et z0
          moduletemp = 'bar'+i # création d'un pointeur vers un module
          module.setValue(moduletemp,0,tempval) #application des valeurs dynamiques
          


    test() #exécution de la fonction
    Gael Abegg Gauthey (former known as Lupin)
    https://www.linkedin.com/in/abegg-gauthey/
  • User avatar
    The Midi Thief
    master
    Posts: 483
    Joined: Thu Sep 29, 2005 7:19 pm
    Location: Stockholm, Sweden
    Contact:

    by The Midi Thief » Mon Apr 16, 2007 10:22 pm

    Did that solve it for you? If not, I'd take a stab at it. Are you going to post that module soon? I'd love to try it out soon.
  • cerbellum
    member
    Posts: 27
    Joined: Sun May 07, 2006 3:59 pm
    Location: Antwerp, Belgium

    by cerbellum » Tue Apr 17, 2007 4:04 pm

    The above sollution didn't solve it but after f*cking around with it for some hours I got finally got it :).

    Code: Select all

    def wiictrl(b, c, a0, adiv, accvis = '', degvis = '', rot = '', col = '', sca = ''):
       a = txt[b]
       a = float(a)
       
       #x signal smoothing
       c.append(a)
       if len(c) == 4:
          del c[0]
       a = (c[0]+2*c[1] + c[2])/4
       
       
       #visualize value
       module.setValue (accvis,0,a)
       
       #mode selection
       if mode == 'rotate':
          a -= a0
          a = a/adiv
          a = asin(a)
          a = degrees(a)
          print a
          module.setValue (degvis,0,a)
          modul8.setValue (rot,a,0)
       
       elif mode == 'colorize':
          a -= a0
          a = a/adiv
          modul8.setValue (col,a,0)
       
       elif mode == 'scale':
          a -= a0
          a = a/adiv
          a = asin(a)
          modul8.setValue (sca,a,0)


    and the triggering lines for x, y and z:

    Code: Select all

    wiictrl(0,listx,x0,xdiv,accvis = 'accX', degvis = 'degX', rot = 'direct_layer_rotation_z', col = 'direct_layer_color_additiveR', sca = 'direct_layer_scale_x')

    wiictrl(1,listy,y0,ydiv,accvis = 'accY', degvis = 'degY', rot = 'direct_layer_rotation_y', col = 'direct_layer_color_additiveG', sca = 'direct_layer_scale_y')
          
    wiictrl(2,listz,z0,zdiv,accvis = 'accZ', degvis = 'degZ', rot = 'direct_layer_rotation_x', col = 'direct_layer_color_additiveB', sca = 'direct_layer_scale_z')


    Way cleaner I'd say :)

    Thanks for the input guys!

    I'll be uploading the new module to the project blog (http://www.ramdac.be) when ready, I'll keep you guys updated!
  • Lupin
    garageCube team
    Posts: 383
    Joined: Fri Aug 18, 2006 12:37 pm
    Location: France
    Contact:

    by Lupin » Tue Apr 17, 2007 4:50 pm

    oh yeah taht's smart i totally forgot that we cold add expresisons inside arguements :)

    i eager to test your module.
    hehe i already have a wiimote and tried with wii to midi but the signal is so jerky. i saw you used a mean over 4 values to smooth it, did you think about adding a tweaking pot to change the smoothing amount?
    Gael Abegg Gauthey (former known as Lupin)
    https://www.linkedin.com/in/abegg-gauthey/
  • cerbellum
    member
    Posts: 27
    Joined: Sun May 07, 2006 3:59 pm
    Location: Antwerp, Belgium

    by cerbellum » Tue Apr 17, 2007 9:31 pm

    Posted the updated version on my blog, all necessary files included, be sure to check te readme file ;)

    right after the jump!

    Feel free to comment on it on my project blog and have fun with it!
  • User avatar
    The Midi Thief
    master
    Posts: 483
    Joined: Thu Sep 29, 2005 7:19 pm
    Location: Stockholm, Sweden
    Contact:

    by The Midi Thief » Thu Apr 19, 2007 11:00 am

    Nice Work! I fiddled around with it for a short while and after a while I seemed to get most things working propperly. I never got the color option to work however. Now off to work, no time for play.
  • User avatar
    G4jima
    member
    Posts: 25
    Joined: Tue Feb 19, 2008 3:57 pm
    Location: UK
    Contact:

    WII MODULE ELUSIVE! :(

    by G4jima » Mon Jun 02, 2008 9:07 pm

    Hey guys,

    do you think this module is gonna be shared for us non coding lunatics.
    Only im driving myself up the wall checking ramdac and attempting to email a pop3 account that gets returned nonetheless.

    I need this module should I be able to compile it using just this script for I have no idea unfortunately, I am at your mercy.

    Ramdac wwhats happenin dude?

Who is online

Users browsing this forum: No registered users and 16 guests