BSS Soundweb London BLU-800

RicardoSiqueiraRicardoSiqueira Junior MemberPosts: 373
I wonder if anybody out there have succesfully integrated AMX and BSS Soundweb London BLU-800. I've spent a whole day trying to use the AMX sample projects and the one downloaded from the BSS site and no luck. I just need to switch inputs (1 to 8) to a fixed output (output 1) and control the Main Volume Output. I am using the the HiQNet Node Adddress of the unit I am testing and still no luck. This is driving me nuts. Any suggestions? Any sample code? Thanks,

Ricardo

Comments

  • BigsquatchBigsquatch Junior Member Posts: 216
    I worked with a BLU-160 once and it took what seemed like forever to make sense of the include file and documentation. Unfortunately I don't have access to that code anymore. I do have scraps from that project from before I got it working. That is where the code posted below is from.

    If you have the DSP file and can look at it in Architect that will be helpful, otherwise you will need the HiQNet addresses of the DSP blocks that you want to control from whomever programmed the device. You don't need the address of the BLU-800 itself.

    Define the blocks that you will be using in DEFINE_CONSTANTS
    CHAR CHAPEL_GAIN[] 	 = {$70,$97,$03,$00,$01,$15}  	// Chapel room GAIN N-INPUT dsp5FIRE
    CHAR MULTI_GAIN[] 	 = {$0F,$DE,$03,$00,$01,$3B}	// Multi purpose room GAIN N-INPUT dsp3FIRE
    

    You can then subscribe to levels on the objects
    DEFINE_FUNCTION SUBSCRIBE_ALL()
    {
       CALL 'SUBSCRIBE%'(CHAPEL_GAIN,N_GAIN,0,1,GAIN)	// FB[1][10] SUBSCRIBE %'S ALWAYS HELD IN COLUMN 10
       CALL 'SUBSCRIBE' (CHAPEL_GAIN,N_GAIN,0,1,MUTE)	// FB[2]
       CALL 'SUBSCRIBE%'(MULTI_GAIN,N_GAIN,0,1,GAIN)	// FB[3][10] SUBSCRIBE %'S ALWAYS HELD IN COLUMN 10
       CALL 'SUBSCRIBE' (MULTI_GAIN,N_GAIN,0,1,MUTE)	// FB[4]
    }
    

    On the unit I worked with the DSP programmer had set up presets for switcing inputs which helped make things easier for me
    BUTTON_EVENT[dvTP_Chapel_P3,1]	// (local audio)
    BUTTON_EVENT[dvTP_Chapel_P3,2]	// (sanctuary audio)
    {
       PUSH:
       {
    	ON[dvTP_Chapel_P3,BUTTON.INPUT.CHANNEL]
    	SWITCH(BUTTON.INPUT.CHANNEL)
    	{
    	   CASE 1: { SET_PRESET(PARAMETER_PRESET, 6) } 		
    	   CASE 2: { SET_PRESET(PARAMETER_PRESET, 7) }	
    	}
       }
    }
    

    Volume was handled by using the SET_GAIN% function to set the gain to the value of variables in the project
    BUTTON_EVENT [dvTP_Chapel_P3,11]		// Local Volume Up
    BUTTON_EVENT [dvTP_MultiPurpose_P3,11]	// Local Volume Up
    {
       PUSH: //RAMP UP
       {
    	// IF not already maxed
    	IF (nChapelVolume < (MAX_RAMPGAIN_PER - GAIN_STEP_PER))
    	{
    	   nChapelVolume = nChapelVolume + GAIN_STEP_PER;
    	   CALL 'SET_GAIN%'(CHAPEL_GAIN, N_GAIN, 0, 1, nChapelVolume)
    	}
       }
       HOLD[1,REPEAT]:
       {
    	// If not already maxed
    	IF (nChapelVolume < (MAX_RAMPGAIN_PER - GAIN_STEP_PER))
    	{
    	   nChapelVolume = nChapelVolume + GAIN_STEP_PER;
    	   CALL 'SET_GAIN%'(CHAPEL_GAIN, N_GAIN, 0, 1, nChapelVolume)
    	}
        }
    
    }
    

    IMPOTRANT: I'm 99% sure that there are problems with the code that I posted.

    I eventually got it all working and if I remember correctly it all came down to making sure that the BSS defined constants that I was passing to the functions were the right ones. The help file shows many many different possibilities but does not explain which ones go with which DSP blocks. (Plus the DSP guy had change a bunch of the programming and neglected to tell me until I had him come back out to the job site to help troubleshoot!!!)

    Hope that helps.
  • RicardoSiqueiraRicardoSiqueira Junior Member Posts: 373
    Thanks Bigsquatch. I actually have the unit with me (BLU-800), and the HiQnet ID from the device properties window is 0x100C. How do I come up with the other adresses like you mentioned above.. In the AMX sample code here are constants:

    CHAR IO_CARD1[] = {$05,$f1,$03,$00,$00,$01};// I/O CARD SLOT A IS ALWAYS OBJECT ID $00,$00,$01
    CHAR IO_CARD2[] = {$05,$f1,$03,$00,$00,$02};// I/O CARD SLOT B IS ALWAYS OBJECT ID $00,$00,$02
    CHAR IO_CARD3[] = {$05,$f1,$03,$00,$00,$03};// I/O CARD SLOT C IS ALWAYS OBJECT ID $00,$00,$03
    CHAR IO_CARD4[] = {$05,$f1,$03,$00,$00,$04};// I/O CARD SLOT D IS ALWAYS OBJECT ID $00,$00,$04
    CHAR HALL_A[] = {$05,$f1,$03,$00,$01,$00};//ROOM_COMBINE PROCESSING OBJECT
    CHAR CHAP_AUTO[] = {$05,$f1,$03,$00,$01,$01}; //AUTOMIXER DEVICE IN LONDON ARCHITECTURE
    CHAR BR_MIC_MIXER[] = {$05,$f1,$03,$00,$01,$06}; //MIXER
    CHAR MR_MIC_MIXER[] = {$05,$f1,$03,$00,$01,$07};//MIXER
    CHAR VIDEO_SERVER[] = {$05,$f1,$03,$00,$01,$08};//ROUTER
    CHAR MICS[] = {$05,$f1,$03,$00,$01,$02};//MATRIX MIXER
    CHAR WC_GAIN[] = {$05,$f1,$03,$00,$01,$04}; //GAIN OBJECT
    CHAR RED_ROOMGAIN[] = {$05,$f1,$03,$00,$01,$09}; //N-GAIN OBJECT
    CHAR SYSTEM_MATRIX[] ={$05,$f1,$03,$00,$01,$0A}; //SOURCE_MATRIX
    CHAR BRIEFING_ROOM[] ={$05,$f1,$03,$00,$10,$0C}; //SOURCE_SELECTOR -' THIS IS THE ROOM'

    How do I calculate or apply the HiQnet ID (0x100C) from my unit to the above constants? Is there another location in the Soundweb Architect Software that I can find the correct HEX values? Thanks!
  • Andrew G WelkerAndrew G Welker Junior Member Posts: 124
    If you open up London Architect and select the block you want to control, the HiQNet address is in the properties window under the general heading.
  • BigsquatchBigsquatch Junior Member Posts: 216
    Also keep in mind that the include file is setup to work with a system that they used for testing their code, so all of the defined blocks are unlikely to apply to anything in your system.

    I commented out pretty much all of the DSP blocks in the include file and defined just the ones I needed. In the subscribe_all function I also got rid of everything and only put my blocks in there.

    This is one reason why it took so long to sort things out. The include file is built to utilize every possible type of block and function. It took forever just commenting out code, paring it down to the bare minimum and then making sure it still compiled.
  • RicardoSiqueiraRicardoSiqueira Junior Member Posts: 373
    Thanks guys! Late last night, I started to communicate with the BLU-800 using the AMX module. So far I have the souce selector working and volume functions. Without your help, I would never be able to figure out the HiQNet addresses locations. The module documentation needs screen shots and proper guidance. Again thanks for all your help!!!
  • Andrew G WelkerAndrew G Welker Junior Member Posts: 124
    Thanks guys! Late last night, I started to communicate with the BLU-800 using the AMX module. So far I have the souce selector working and volume functions. Without your help, I would never be able to figure out the HiQNet addresses locations. The module documentation needs screen shots and proper guidance. Again thanks for all your help!!!

    What it really needs to be is a proper module, not just an include file. There's no reason it couldn't be similar to the Biamp module in the way it works when it comes to adding components and blocks to look at.
  • AuserAuser Junior Member Posts: 506
    What it really needs to be is a proper module, not just an include file.

    I'd go as far as to say that whatever they produce needs to be written by a real AMX programmer, not somebody from BSS who cobbled something together for a trade show.

    The control protocol is comprehensive but complex, so it doesn't help that their sample code's horrendous. I've been providing feedback on this via our local distributor for a while. It took me about a week to make sense of their code and get it straightened out.
  • amclainamclain Junior Member Posts: 41
    Auser wrote: »
    I'd go as far as to say that whatever they produce needs to be written by a real AMX programmer, not somebody from BSS who cobbled something together for a trade show.

    I just stumbled across this post and actually published an open source BSS Soundweb API back in April because the BSS example was so frustrating to use. It’s an alpha version and still has features that need to be developed, but the include file can be dropped into a project and things like set% can be used with a simple function call that accepts a HiQnet address.
    bssSetPercent(char control[], long value)
    

    An overview of the API can be found in the header comments of amx-lib-bss.axi. It is also important to be familiar with the London DI Kit (link to file included in comments), as I tried to adhere to the Soundweb concepts and terminology as much as possible when creating the API so that using it feels like using a BSS product.

    One important thing to note is that I ran into big problems when trying to use the NetLinx log10_value() function to decode Soundweb levels. It’s a long story. I’ve been migrating towards Duet anyway, so I’m considering redoing this API as a native Duet API with a NetLinx wrapper so that it works on both platforms. The current website has intentionally been neglected because of this.

    I have successfully used the alpha version of the API on real projects, so it is functional.
  • travistravis Junior Member Posts: 180
    Thank you for releasing that. I've used the BSS provided code and I'm starting on a new project.
    So far control is working great.
    Do you have a function to convert incoming messages back to Address+StateVariable and value? Maybe I'm missing it.

    edit: this works (for discretes). not finished and disorganized, but it's a start
    STRING: {
    	LOCAL_VAR  CHAR _msg2[20]; 
    	
    	LOCAL_VAR CHAR unescaped[20]
    	LOCAL_VAR CHAR _addr[8]
    	LOCAL_VAR CHAR _char
    	LOCAL_VAR SLONG _value
    	LOCAL_VAR INTEGER _max
    	STACK_VAR CHAR dummy[20]
    	LOCAL_VAR CHAR checksum;
    	LOCAL_VAR CHAR checksum_in;
    	LOCAL_VAR CHAR command_type;
    	STACK_VAR INTEGER i
    	
    	_msg2 = DATA.TEXT
    	unescaped = dummy
    	
    	_max = length_array(_msg2) - 1
    	checksum = 0
    	checksum_in = (_msg2[_max])
    	command_type = type_cast(MID_STRING(_msg2,2,1))
    	checksum = (checksum ^ command_type)
    	for (i = 3; i <= _max - 1; i++)
    	{
    	    if ( _msg2[i] == BSS_ESC)
    	    {
    		i++
    		_char = _msg2[i] - $80
    	    }
    	    else
    	    {
    		_char = _msg2[i];
    	    }
    	    
    	    unescaped = "unescaped, _char ";
    	    checksum = (checksum ^ _char);
    	}
    	_addr = LEFT_STRING(unescaped,8)
    	_value = TYPE_CAST(RIGHT_STRING(unescaped,1))
    
Sign In or Register to comment.