コード例 #1
0
void mode_0(void) {
	uint8_t dmx_index = (uint8_t) 0;
	bool dmx_new_data = false;

	if (midi_get_active_sense_state() == MIDI_ACTIVE_SENSE_FAILED) {
		if (!midi_active_sense_failed) {
			dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, false);
			midi_active_sense_failed = true;
		}

	} else if (midi_active_sense_failed) {
		dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, true);
		midi_active_sense_failed = false;
	}

	if (midi_read_channel(midi_channel)) {

		if (midi_message->channel != 0 ) {
			// Channel messages
			switch (midi_message->type) {
			case MIDI_TYPES_NOTE_OFF:
				dmx_index = dmx_start_address + midi_message->data1; // MIDI Channel starts with 0, DMX address starts with 1
				if (dmx_index <= DMX_UNIVERSE_SIZE) {	// we skip SC
					dmx_data[dmx_index] = (uint8_t) 0;
				}
				dmx_new_data = true;
				break;
			case MIDI_TYPES_NOTE_ON:
				dmx_index = dmx_start_address + midi_message->data1;
				if (dmx_index <= DMX_UNIVERSE_SIZE) {	// we skip SC
					uint8_t data = midi_message->data2 << 1;
					dmx_data[dmx_index] = data;
				}
				dmx_new_data = true;
				break;
			case MIDI_TYPES_CONTROL_CHANGE: {
				switch (midi_message->data1) {
					case MIDI_CONTROL_CHANGE_ALL_NOTES_OFF:
						clear_dmx_data();
						dmx_new_data = true;
						break;
					default:
						break;
				}
				break;
			}
			default:
				break;
			}

			if (dmx_new_data) {
				dmx_set_send_data(dmx_data, 1 + dmx_max_slot);
			}
		}
	}
}
コード例 #2
0
ファイル: widget.c プロジェクト: vanvught/rpidmx512
/**
 *
 * Output Only Send DMX Packet Request (label = 6 \ref OUTPUT_ONLY_SEND_DMX_PACKET_REQUEST)
 *
 * This message requests the Widget to periodically send a DMX packet out of the Widget DMX port
 * at the configured DMX output rate. This message causes the widget to leave the DMX port direction
 * as output after each DMX packet is sent, so no DMX packets will be received as a result of this
 * request.
 *
 * The periodic DMX packet output will stop and the Widget DMX port direction will change to input
 * when the Widget receives any request message other than the Output Only Send DMX Packet
 * request, or the Get Widget Parameters request.
 *
 * @param data_length DMX data to send, beginning with the start code.
 */
void widget_send_dmx_packet_request_output_only(uint16_t data_length) {
	if (widget_send_rdm_packet_start != 0) {
		return;
	}

	monitor_line(MONITOR_LINE_INFO, "OUTPUT_ONLY_SEND_DMX_PACKET_REQUEST");
	monitor_line(MONITOR_LINE_STATUS, NULL);

	dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, false);

	dmx_set_send_data(widget_data, data_length);

	dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, true);
}
コード例 #3
0
void mode_0_init(void) {
	clear_dmx_data();

	midi_message = (const struct _midi_message *) midi_message_get();
	midi_channel = bridge_params_get_midi_channel();

	midi_active_sense_failed = (midi_get_active_sense_state() == MIDI_ACTIVE_SENSE_FAILED);

	dmx_start_address = bridge_params_get_dmx_start_address();
	dmx_max_slot = (dmx_start_address + (uint16_t) 127) <= DMX_UNIVERSE_SIZE ? (dmx_start_address + (uint16_t) 127) : DMX_UNIVERSE_SIZE + (uint16_t) 1; // SC

	dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, false);
	dmx_set_send_data(dmx_data, 1 + dmx_max_slot);	// SC + data
	dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, true);

	monitor_line(5, "Listening channel : %d %s", midi_channel, midi_channel == 0 ? "<OMNI>" : "");
	monitor_line(6, "DMX start address : %d", dmx_start_address);
	monitor_line(7, "DMX slots         : %d", dmx_max_slot);
}