Right, so "message rate" in PureData has no fixed rate, but it's event-driven: every time an event happens which triggers a message, the message is sent out and processed "immediately.
If a pin is set to message rate, messages will only be received or written when the pin's value changes.
This means that if the digital channels is set as an input, whenever the pin's value changes, you will receive a message from the corresponding
[r bela_digitalInXX] receiver object. If you have a button connected to the digital input, you will receive a message every time the button is pressed or released (or it bounces).
If you have a pin set as output at message rate, every time you send a message to the corresponding
[s bela_digitalOutXX] then the output value will change. So if you have an LED, you can send a
[s bela_digitalOutXX] to turn it on, or a
[0( to turn it off.
If you set an input at signal rate, then you will receive from the corresponding
[adc~ XX] object. Your signal will then look like an audio signal composed only of zeros and ones. If set an output at signal rate, then you can write to
[dac~ XX], as you would write to an audio output. Your output will be thresholded at 0.5 and the actual signal sent the pin will be entirely made of ones and zeros.
Last, you should be able to use
[print~] in Bela normally.
Yet, the best method for inspecting signals is probably to use the Bela scope: send any signal from anywhere in your patch to
[dac~ 27] through to
[dac~ 30] to visualize it in the scope window.
Hope this is more clear now.