Blogpages

  • Garageband Control Codes GarageBand's control messages are non-standard (they would be, wouldn't they). These are the control messages sent by the iControl for each function: all sent on Channel 1 ...
    Posted 16 May 2010, 02:28 by Cees Verhagen
  • MSCRM: Iframes in tabs A client asked: We have a MSCRM form with several IFRAMES contained in multiple tabs. The form is slow to load - what can we do to improve the performance?The ...
    Posted 14 May 2010, 22:54 by Cees Verhagen
Showing posts 1 - 2 of 2. View more »

Garageband Control Codes

posted 16 May 2010, 02:24 by Cees Verhagen   [ updated 16 May 2010, 02:28 ]

GarageBand's control messages are non-standard (they would be, wouldn't they). These are the control messages sent by the iControl for each function: all sent on Channel 1 (I think probably any channel would do).

However it seems doubtful that sending these messages from some other controller will have the same results. GarageBand does not respond to most of these controllers in their intended form, but I found that 64 (Sustenuto Pedal) caused that result rather than 'Record track 3' when assigned to the Modulation wheel on my Evolution keyboard: so it's possible that some or all of these commands only work when the iControl's driver (hidden within GarageBand) is in use.

The iControl was designed to work with GarageBand 2. I haven't tried the later versions, but comments on the Apple Forums suggests that their support for the iControl is flaky at best.



RECORD
Controller 106 127
Controller 106 0

SKIP TO BEGINNING
Controller 107 127
Controller 107 0

SKIP BACK
Controller 108 127
Controller 108 0

PLAY
Controller 109 127
Controller 109 0

SKIP FORWARD
Controller 110 127
Controller 110 0

CYCLE
Controller 111 127
Controller 111 0

JOG FORWARD
Controller 24 1

JOG BACKWARD
Controller 24 127


TRACK CONTROLS

Note that the tracks are controlled in groups of 8, selected by the Bank Select buttons. 'Volume' and 'Pan' buttons assign the rotary controllers on each track to either of theses parameters. 

Each button sends its parameter and value 127 on press and 0 on release. Each rotary controller sends its parameter and value 127 on one click clockwise (up) and 0 on one click anticlockwise (down).

The names given are those reported by MIDI Monitor: I have included the standard MIDI Controller numbers in square brackets where I could identify them. (Contoller numbers below are the same, e.g. Controller 88 is [88]


Select Volume: Data Button -1 [06?] press 127 release 0
Select Pan: Non-Registered Parameter LSB [98] press 127 release 0

Track 1
Select: Controller 88 press 127 release 0
Record: Hold Pedal [?] press 127 release 0
Mute: General Purpose 5 [80] press 127 release 0
Solo: Release Time [72] press 127 release 0
Track Volume/Pan: General Purpose 1 (coarse) [16] up 1 down 127

Track 2
Select: Controller 89 press 127 release 0
Record: Portamento On/Off [84] press 127 release 0
Mute: General Purpose 6 [81]press 127 release 0
Solo: Attack Time [73]press 127 release 0
Track Volume/Pan: General Purpose 2 [17](coarse) up 1 down 1

Track 3
Select: Controller 90 press 127 release 0
Record: Sustenuto Pedal [64] press 127 release 0
Mute: General Purpose 7 [82] press 127 release 0
Solo: Brightness [?] press 127 release 0
Track Volume/Pan: General Purpose 3 (coarse)[18] up 1 down 127

Track 4
Select: Reverb Send Level [?] press 127 release 0
Record: Soft Pedal [67] press 127 release 0
Mute: General Purpose 8 [83] press 127 release 0
Solo: Decay Time [72?] press 127 release 0
Track Volume/Pan: General Purpose 4 (coarse) [19] up 1 down 127

Track 5
Select: Tremolo Depth [92] press 127 release 0
Record: Legato Pedal [68] press 127 release 0
Mute: Portamento Control [84] press 127 release 0
Solo: Vibrato Rate [?] press 127 release 0
Track Volume/Pan: Controller 20 up 1 down 127

Track 6
Select: Chorus Send Level [93?] press 127 release 0
Record: Hold 2 Pedal [?] press 127 release 0
Mute: Controller 85 press 127 release 0
Solo: Vibrato Depth [?] press 127 release 0
Track Volume/Pan: Controller 21 up 1 down 127

Track 7
Select: Celeste/Detune Depth [94] press 127 release 0
Record: Sound Variation [70] press 127 release 0
Mute: Controller 86 5 press 127 release 0
Solo: Vibrato Delay[?] press 127 release 0
Track Volume/Pan: Controller 22 up 1 down 127

Track 8
Select: Phaser Depth [95] press 127 release 0
Record: Timbre/Resonance [71] press 127 release 0
Mute: Controller 87 press 127 release 0
Solo: Sound control 10 [?] press 127 release 0
Track Volume/Pan: Controller 23 up 1 down 127

Bank (of 8 tracks):
Up: Controller 104 press 127 release 0
Down: Controller 105 press 127 release 0

Master Volume:
Channel Volume (coarse) - 0-127 with position of slider

MSCRM: Iframes in tabs

posted 14 May 2010, 22:53 by Cees Verhagen   [ updated 14 May 2010, 22:54 ]

A client asked: We have a MSCRM form with several IFRAMES contained in multiple tabs. The form is slow to load - what can we do to improve the performance?

The performance issue is at the client browser due to the frames all loading at once. One way to improve performance is to delay loading an IFRAME until the tab where it is located is clicked.

To do this, you need to create a function that sets the source of the IFRAME and then attach the function to the onclick event of the tab. Below is an IFRAME named ‘IFRAME_myiframe’ and the original url is set to ‘about:blank’. We want the IFRAME to display the Bing search engine when it’s tab is displayed. 

IFRAME Load function
Setting an IFRAME source via javascript is a simple piece of code that CRM customizers should be familiar with. We’re going to embed the code within a function:

LoadFrame = function() { 
crmForm.all.IFRAME_myiframe.src='http://www.bing.com'; 
}

This function should be placed in the OnLoad event of the form.

The Tab Element
Next, we need to identify the name of the specific tab we want. The id of any tab on a CRM form is ‘tabXTab’ where ‘X’ represents the zero-based index of the tab. So the first tab is named tab0Tab, the second is named tab1Tab, etc. The tab we want to work with is the second tab, so the element we want is named ‘tab1Tab’.

After you have identified the tab element, attach the load function:

document.getElementById('tab1Tab').onclick = LoadFrame;

Note: Place this code in the form’s OnLoad event, but make sure it comes after the load function defined above.

That's it. When you click on tab, the related IFRAME will load and the performance should be improved.

1-2 of 2