Version 1 of Reading Carla patchbay into BWise blocks and Tcldot

Updated 2016-12-15 19:03:36 by theover

A first little report on some preparations and a night work to read the Jack connection information (Linux Audio) from a saved "Carla" state and putting it into a BWise connected block form.

I used the first procedure from A little XML parser to read and somewhat verify the integrity of the XML data.

# # read the (test) "Carla" input file with as the last part the "patchbay" # XML information describing the Jack (audio) connections # as "source/target" pairs with additional pin names set xmltext "" set xmlf open test.carxp while {eof $xmlf == 0} {

    append xmltext "[gets $xmlf]\n"

} close $xmlf

# Use RS's "xml2list" procedure to read all the connections in "xmlo" set count 0; set xmlo "" foreach i [lindex [lrange [

    xml2list [string range $xmltext [string first "<Patchbay>" $xmltext] [
       expr [string first "</Patchbay>" $xmltext] + [string length "</Patchbay>"]]]
   ] 1 end] 1] { 
   if {[lindex [lindex [lindex $i 2] 1] 0] == "Target" 
    && [lindex [lindex [lindex $i 2] 0] 0] == "Source"} {
      append xmlo "[lindex [lindex [lindex [lindex [lindex $i 2] 0] end] 0] end],[lindex [lindex [lindex [lindex [lindex $i 2] 1] end] 0] end]\n"
      incr count
   }

}

# Jack(d) named audio connection can contain most characters (no . and ! I think) # BWise block and pin names want only alnums and _s proc stringtoblockname { {str} } {

        set o ""
           foreach i [split $str {}] {
              if {[string is alnum $i]  || $i == "_"} {
                 append o $i
              } {
                  append o "_"
              }
           }
           return [string tolower $o]
        }

# Read through the xmlo lines with 4 names for a connection # (2 blocks, 2 pins) and create array entries per unique # block name and list all the connected pins (in or out) array unset xmlins array unset xmlouts foreach i split $xmlo '\n' {

   if {$i != "" } {
      lappend xmlouts([lindex [split [lindex [split $i ','] 0] ':'] 0]) [lindex [split [lindex [split $i ','] 0] ':'] 1]
      lappend  xmlins([lindex [split [lindex [split $i ','] 1] ':'] 0]) [lindex [split [lindex [split $i ','] 1] ':'] 1] 
   }

}

# Create BWise blocks from the above gathered info # simply all on a row, but with the correct number of # pins and simplified block names # and a special "testxml" additional canvas tag set ix 50 foreach i lsort -uni [concat [array names xmlins array names xmlouts] {

   set ins {}; set outs {}
   if [info exists xmlins($i) ] {
      foreach j [lsort -unique $xmlins($i)] {
         lappend ins [stringtoblockname $j]
      }
   }
   if [info exist xmlouts($i)] {
      foreach j [lsort -unique $xmlouts($i)] {
         lappend outs [stringtoblockname $j]
      }
   }
   if {[llength $ins] > [llength $outs]} {
      set height [expr 17+ 18 * [llength $ins]]
   } {
      set height [expr 17+ 18 * [llength $outs]]
   }
   eval newblock [stringtoblockname $i] $ix 50 40 $height "\{$ins\}" "\{$outs\}" testxml ; set ix [expr $ix + 50]

}

# and connect the blocks according to the XML spec foreach i split $xmlo '\n' {

   if {$i != "" } {
      connect {} [stringtoblockname [lindex [split [lindex [split $i ','] 0] ':'] 0]] [stringtoblockname [lindex [split [lindex [split $i ','] 0] ':'] 1]] [stringtoblockname [lindex [split [lindex [split $i ','] 1] ':'] 0]] [stringtoblockname [lindex [split [lindex [split $i ','] 1] ':'] 1]]
   }

}