static gboolean configure=FALSE;
static snd_rawmidi_t *input;
+snd_rawmidi_t *cw_midi_output = NULL;
void configure_midi_device(gboolean state) {
configure=state;
for(i=0;i<n_midi_devices;i++) {
if(strcmp(myname,midi_devices[i].name)==0) {
strcpy(portname,midi_devices[i].port);
- if ((ret = snd_rawmidi_open(&input, NULL, midi_devices[i].port, SND_RAWMIDI_NONBLOCK)) < 0) {
+ if ((ret = snd_rawmidi_open(&input, &cw_midi_output, midi_devices[i].port, SND_RAWMIDI_NONBLOCK)) < 0) {
g_print("%s: cannot open port \"%s\": %s\n", __FUNCTION__, midi_devices[i].port, snd_strerror(ret));
break;
}
char *port;
} MIDI_DEVICE;
+#include <alsa/asoundlib.h>
+
#define MAX_MIDI_DEVICES 10
extern MIDI_DEVICE midi_devices[MAX_MIDI_DEVICES];
extern int n_midi_devices;
+extern snd_rawmidi_t *cw_midi_output;
extern void get_midi_devices();
extern int register_midi_device(char *myname);
// NewProtocol: rely on periodically sent HighPrio packets
#ifdef LOCALCW
keyer_update();
+ midi_keyer_update();
#endif
//
// speed and side tone frequency are displayed in the VFO bar
cw_changed();
}
+static void cw_keyer_midi_cb(GtkWidget *widget, gpointer data) {
+ cw_keyer_midi = cw_keyer_midi == 1 ? 0: 1;
+ cw_changed();
+}
+
static void cw_keyer_spacing_cb(GtkWidget *widget, gpointer data) {
cw_keyer_spacing=cw_keyer_spacing==1?0:1;
cw_changed();
gtk_widget_show(cw_keyer_spacing_b);
gtk_grid_attach(GTK_GRID(grid),cw_keyer_spacing_b,0,11,1,1);
g_signal_connect(cw_keyer_spacing_b,"toggled",G_CALLBACK(cw_keyer_spacing_cb),NULL);
+
+ GtkWidget *cw_keyer_midi_b=gtk_check_button_new_with_label("CW handled in MIDI Keyer");
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw_keyer_midi_b), cw_keyer_midi);
+ gtk_widget_show(cw_keyer_midi_b);
+ gtk_grid_attach(GTK_GRID(grid),cw_keyer_midi_b,0,12,1,1);
+ g_signal_connect(cw_keyer_midi_b,"toggled",G_CALLBACK(cw_keyer_midi_cb),NULL);
+
#endif
gtk_container_add(GTK_CONTAINER(content),grid);
void DoTheMidi(int code, enum ACTIONtype type, int val);
#endif
+
+void midi_keyer_update();
#include "actions.h"
#include "midi.h"
+#include "alsa_midi.h"
struct cmdtable MidiCommandsTable;
return 0;
}
+
+void midi_keyer_update(void) {
+ // read the global cw_keyer_speed and send midi commands
+ char wpmctrl[4] = {0xb1, 0, cw_keyer_speed}; // 0xb0, lower nibble is channel number.
+
+ int status;
+ if (cw_midi_output != NULL) {
+ fprintf(stderr, "MIDI Keyer: setting WPM to %d\n", cw_keyer_speed);
+ if ((status = snd_rawmidi_write(cw_midi_output, wpmctrl, 4)) < 0) {
+ fprintf(stderr, "Problem writing to MIDI output: %s", snd_strerror(status));
+ }
+ } else {
+ fprintf(stderr, "MIDI device is not open yet\n");
+ }
+}
int cw_keyer_weight = 50; // 0-100
int cw_keyer_spacing = 0; // 0=on 1=off
int cw_keyer_internal = 1; // 0=external 1=internal
+int cw_keyer_midi = 0; // 0 = (external) midi keyer
+ // disabled, 1 = enabled
int cw_keyer_sidetone_volume = 50; // 0-127
int cw_keyer_ptt_delay = 20; // 0-255ms
int cw_keyer_hang_time = 500; // ms
if (!duplex) {
reconfigure_transmitter(transmitter, display_width, rx_height);
}
+#ifdef MIDI
+ if (cw_keyer_midi == 1) {
+ midi_keyer_update();
+ }
+#endif
}
}
g_print("Initialize keyer.....\n");
keyer_update();
}
+
+ if (cw_keyer_midi == 1) {
+ midi_keyer_update();
+ }
#endif
#ifdef CLIENT_SERVER
if (register_midi_device(midi_device_name) < 0) {
midi_enabled = FALSE;
}
+ if (cw_keyer_midi == 1) {
+ midi_keyer_update();
+ }
} else {
midi_enabled = FALSE;
}
if (value)
cw_keys_reversed = atoi(value);
value = getProperty("cw_keyer_speed");
- if (value)
+ if (value) {
cw_keyer_speed = atoi(value);
+ // if we have the midikeyer, set the speed to this value
+ midi_keyer_update();
+ }
value = getProperty("cw_keyer_mode");
if (value)
cw_keyer_mode = atoi(value);
value = getProperty("cw_keyer_internal");
if (value)
cw_keyer_internal = atoi(value);
+
+ value = getProperty("cw_keyer_midi");
+ if (value)
+ cw_keyer_midi = atoi(value);
+
#endif
value = getProperty("cw_keyer_sidetone_volume");
if (value)
setProperty("cw_keyer_spacing", value);
sprintf(value, "%d", cw_keyer_internal);
setProperty("cw_keyer_internal", value);
+
+ sprintf(value, "%d", cw_keyer_midi);
+ setProperty("cw_keyer_midi", value);
+
sprintf(value, "%d", cw_keyer_sidetone_volume);
setProperty("cw_keyer_sidetone_volume", value);
sprintf(value, "%d", cw_keyer_ptt_delay);
gdk_cursor_new(GDK_ARROW));
#ifdef MIDI
MIDIstartup();
+ if (cw_keyer_midi == 1) {
+ midi_keyer_update();
+ }
#endif
for (int i = 0; i < receivers; i++) {
gint timer_id = gdk_threads_add_timeout_full(
extern int cw_keyer_weight;
extern int cw_keyer_spacing;
extern int cw_keyer_internal;
+extern int cw_keyer_midi;
extern int cw_keyer_sidetone_volume;
extern int cw_keyer_ptt_delay;
extern int cw_keyer_hang_time;
cw_keyer_speed = speed;
#ifdef LOCALCW
keyer_update();
+#endif
+#ifdef MIDI
+ midi_keyer_update();
#endif
vfo_update();
}
cw_keyer_speed = speed;
#ifdef LOCALCW
keyer_update();
+ midi_keyer_update();
#endif
vfo_update();
}