Midi program change in performance mode

  • I may have made some sense of this.
    And all the Admin supplied did provide enough information to address most of this...

    If Reaper is sending a value of +1 as the admin has suggested might be the case, then....

    I "think" I'm sending the right commands because the Kemper is responding how I expect it too. Some of the time (and the Admin is a fool). But what I believe is happening are some circumstances that are leading me to believe I'm seeing something that I am actually not (and the Admin is not a fool after all).
    So If I send...
    1: C0 0C 00 [Program Change] chan 1 val 11 - I think I'm right, but what Kemper sees is a value of 12 (+1) thus recalling Slot 2 instead of 1 (UNLESS this is the ONLY command it gets. In which case it responds how I think it should. But that is just an illusion because it actually tried to recall something I wasn't expecting, I just didn't realize it. (What it actually did though is still a mystery)
    1: C0 0C 00 [Program Change] chan 1 val 12 - Again, I think I'm right but Kemper sees a value of 13 which is Slot 3, which is EMPTY. (So Kemper responds differently yet again, than in the first command)


    But this could explain why stuff is coming out backwards. If Kemper sees my command for an empty slot PC#13 (12+1) what actually happens? The Admin states that the command is ignored. If that's the case then the Kemper should just stay at Slot 2 (or the last Perf #, Slot # it was on). But it doesn't. It seems to default back to slot 1 when it receives the PC#13 command.
    If it does default to slot 1, that would explain this backward issue I'm having.

    1: C0 0C 00 [Program Change] chan 1 val 11 would then Recall PERF 3 Slot 2 (Because +1 is 12)

    2: C0 0B 00 [Program Change] chan 1 val 12 would then Recall PERF 3 Slot 3 (Because +1 is 13) But Slot 3 is EMPTY. If Kemper defaults to Slot 1, slot 1 is recalled

    3: C0 0C 00 [Program Change] chan 1 val 11 would then Recall PERF 3 Slot 2 (Because +1 is 12)
    If Kemper is defaulting to slot 1 when it encounters an empty slot, this string would recall Perf 3, Slot 2, Slot 1, Slot 2 . Which is what I'm seeing. It's backwards of what I think I'm sending. If Kemper was ignoring the empty slot command then I would think I should see Perf 3, Slot 2, Slot 2 (because command ignored), Slot 2.

    BUT if all that is true then it is super strange that when I send a single line of :
    1: C0 0C 00 [Program Change] chan 1 val 11 - Kemper Recalls Perf 3 Slot 1 As expected.
    Why is this Strange? Because shouldn't it be recalling Perf 2 Slot 5...Which is EMPTY? So if Kemper is ignoring the command, then it should stay on the the last Perf# Slot #. But if its defaulting like described above, Then one would think the Kemper would recall Perf 2 Slot 1. AND.. It doesn't do either.

    So the Question now becomes. What is Kemper actually doing when it receives a command for an Empty slot? Is it Ignoring it (because it doesn't appear to be) or is it defaulting to the next closest slot with something in it? What is it actually doing? Perhaps the Admin can shed some light here. Personally I don't believe its ignoring the command, But clearly I've been tricked by this machine before....

    Regardless, I believe my problem is totally solved by sending with the +1 in consideration (I wont be in front of the Kemper for a few hours to try it)


    But in theory..

    1: C0 0C 00 [Program Change] chan 1 val 10

    2: C0 0B 00 [Program Change] chan 1 val 11

    3: C0 0C 00 [Program Change] chan 1 val 10

    Should recall Perf 3 Slot 1, Slot2, Slot1.

    As I want it too.

    Making the Admin spot on about the +1 Value and the true resolution to my ignorance. And he didn't just give up the answer. He gave me all the info and made me work the problem. So now I think I actually understand better and programming the Kemper will be much easier moving forward. So thank you Admin.

    "To err is human, but to really foul things up you need a computer.":P

  • And....it works. It was indeed simple stupid....
    Subtracting 1 from what is displayed on the Kemper window, solved all issues and it work perfect.
    Thanks Admin. Even though I now know how to avoid it, Still curious what its doing when it his a blank slot......

    "To err is human, but to really foul things up you need a computer.":P

    Edited once, last by dswguitars ().

  • When I send this ...


    1: C0 0C 00 [Program Change] chan 1 val 11

    2: C0 0B 00 [Program Change] chan 1 val 12

    3: C0 0C 00 [Program Change] chan 1 val 11


    Why does the Stage load Performance 3 slot 2, Perf 3 Slot 1, Perf 3 slot 2 ?



    1. you should stop sending program changes as three-byte commands. A program change only has two bytes according to the MIDI specification. First byte is the command and the channel, second byte is the 7-bit program number. The additional zero is not needed. A well-programmed implementation of a MIDI program should ignore it, but why send additional unnecessary data?


    2. your reading of hex values is off. 0C is hex for 12, 0B is hex for 11. So your program changes (translated in to logical numbers by adding +1) are 13, 12, 13. And definitely not 11, 12, 11 , and also not 10, 11, 10 -> this can't be right at all! Are you sure this is what you are actually sending?


    When I send these hex program changes to my Stage (without the additional 00), I get correct results: Performance 3, slot 3 for C0 0C, and slot 2 for C0 0B. And Slot 3 correctly shows logical program change 13 (hex 0C + 1 = 13) on screen, while slot 2 shows logical program change 12 (hex 0B + 1 = 12) - all is correct and working as designed.


    If you want to select Perf 3 Slot 1, you need to send logical Program change 11, which in hex is C0 0A (0A is hex for decimal 10 - for logical numbers add 1, which makes 11)


    One remark on Bank Select MSB/LSB:

    It also appears to me it is also just ignoring the MSB or LSB as they are redundant

    Bank Select commands are always stored in the device in preparation for the next program change, and the currently selected bank stays set until a new bank select comes along. So if currently bank 0 is selected and you send another bank select 0/0, this just keeps everything as it is - essentially, sending additional bank selects of the same bank changes nothing. In that sense, it is functionally redundant - what else would you expect to happen?


    As long as you stay within the same bank, sending bank selects ahead of a program change isn't strictly necessary. And once you cross into bank 1 and stay in bank 1, again no further bank selects after the first one would be necessary. But in general, for remote switching in performance mode, I would advise to always send bank select before program change, unless you absolutely KNOW you are going to stay within one bank for the whole session...


    Cheers,


    Torsten

    Edited 2 times, last by ToH2002 ().