Added a default website
This commit is contained in:
1 parent
d3d55f96f7
commit
1a8c9147b8
34 files changed
+2420
No files matched your search
@@ -0,0 +1,76 @@
|
||||
---
|
||||
author: "Flávio Schiavoni"
|
||||
description: Hey!
|
||||
---
|
||||
|
||||
/*
|
||||
|
||||
Criado por {{ page.author }}
|
||||
Disponível em {{ page.url }}
|
||||
|
||||
*/
|
||||
#include <sys/stat.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
|
||||
int main(int argc, char ** argv){
|
||||
|
||||
if(argc < 4){
|
||||
printf("Usage:\n");
|
||||
printf("%s sample_rate bit_depth\n", argv[0]);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
char * filename = malloc(strlen(argv[1]));
|
||||
strcpy(filename, argv[1]);
|
||||
|
||||
struct stat st;
|
||||
stat(filename, &st);
|
||||
uint32_t size = st.st_size; //limita o tamanho do arquivo!
|
||||
printf("filesize: %d\n", size);
|
||||
|
||||
// Read file data
|
||||
char * buffer = 0;
|
||||
FILE * f = fopen (filename, "rb");
|
||||
buffer = malloc(size);
|
||||
fread (buffer, 1, size, f);
|
||||
fclose (f);
|
||||
|
||||
char * newfilename = malloc(strlen(argv[1] + 4));
|
||||
strcpy(newfilename, filename);
|
||||
strcat(newfilename, ".wav");
|
||||
FILE *fp = fopen(newfilename,"wb+");
|
||||
|
||||
fwrite("RIFF", 1, 4, fp);
|
||||
int newsize = size + 32; // file size - 8
|
||||
fwrite(&newsize, 1, sizeof(newsize), fp);
|
||||
fwrite("WAVE", 1, 4, fp);
|
||||
|
||||
fwrite("fmt ", 1, 4, fp);
|
||||
int flag = 16; // chunk size
|
||||
fwrite(&flag, 1, 4, fp);
|
||||
flag = 1; // compression code
|
||||
fwrite(&flag, 1, 2, fp);
|
||||
flag = 1; // number of channels
|
||||
fwrite(&flag, 1, 2, fp);
|
||||
flag = atoi(argv[2]); // sample rate
|
||||
fwrite(&flag, 1, 4, fp);
|
||||
flag = flag * atoi(argv[3]) / 8; // bytes per second
|
||||
fwrite(&flag, 1, 4, fp);
|
||||
flag = atoi(argv[3]) / 8; // block align
|
||||
fwrite(&flag, 1, 2, fp);
|
||||
flag = atoi(argv[3]); // significant bits per sample
|
||||
fwrite(&flag, 1, 2, fp);
|
||||
|
||||
fwrite("data", 1, 4, fp);
|
||||
fwrite(&size, 1, 4, fp);
|
||||
|
||||
fwrite(buffer, 1, size, fp);
|
||||
fclose(fp);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
---
|
||||
author: "Flávio Schiavoni"
|
||||
description: O bladi!
|
||||
---
|
||||
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <alsa/asoundlib.h>
|
||||
|
||||
int keep_walking;
|
||||
|
||||
static void sigint_handler(int i){
|
||||
keep_walking = 0;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
int note_time = 1000000; // 1 segundo (em microsegundos)
|
||||
|
||||
// Pega o Ctrl+C ou signal de Kill para a aplicação.
|
||||
signal(SIGINT, &sigint_handler);
|
||||
signal(SIGTERM, &sigint_handler);
|
||||
keep_walking = 1;
|
||||
|
||||
// Crio o dispositivo MIDI
|
||||
snd_seq_t *seq_handle;
|
||||
int portid;
|
||||
if (snd_seq_open(&seq_handle, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) {
|
||||
fprintf(stderr, "Error opening ALSA sequencer.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
snd_seq_set_client_name(seq_handle, "My App Midi");
|
||||
if ((portid = snd_seq_create_simple_port(seq_handle, "My Midi Port",
|
||||
SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ,
|
||||
SND_SEQ_PORT_TYPE_APPLICATION)) < 0) {
|
||||
fprintf(stderr, "Error creating sequencer port.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
snd_seq_event_t ev;
|
||||
snd_seq_ev_clear(&ev);
|
||||
snd_seq_ev_set_source(&ev, 0);
|
||||
snd_seq_ev_set_subs(&ev);
|
||||
snd_seq_ev_set_direct(&ev);
|
||||
|
||||
while (keep_walking) {
|
||||
|
||||
|
||||
// Note on
|
||||
snd_seq_ev_set_noteon(&ev, 0, 60, 127);
|
||||
snd_seq_event_output(seq_handle, &ev);
|
||||
snd_seq_drain_output(seq_handle);
|
||||
// Duration
|
||||
usleep(note_time);
|
||||
|
||||
// Note off
|
||||
snd_seq_ev_set_noteoff(&ev, 0, 60, 0);
|
||||
snd_seq_event_output(seq_handle, &ev);
|
||||
snd_seq_drain_output(seq_handle);
|
||||
// Duration
|
||||
usleep(note_time / 6);
|
||||
|
||||
}
|
||||
|
||||
snd_seq_close(seq_handle);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
---
|
||||
author: "Flávio Schiavoni"
|
||||
description: Obla dá!
|
||||
---
|
||||
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <alsa/asoundlib.h>
|
||||
|
||||
extern struct timespec timespec_diff(struct timespec start, struct timespec end);
|
||||
extern double timespec_millis(struct timespec time);
|
||||
|
||||
snd_seq_t *open_seq();
|
||||
void midi_action(snd_seq_t *seq_handle);
|
||||
int keep_walking;
|
||||
|
||||
static void sigint_handler(int i){
|
||||
keep_walking = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
int note_on_time = 1000000; // 1 segundo
|
||||
int note_off_time = 1000000; // 1 segundo (em microsegundos)
|
||||
|
||||
signal(SIGINT, &sigint_handler);
|
||||
signal(SIGTERM, &sigint_handler);
|
||||
keep_walking = 1;
|
||||
|
||||
// Crio o dispositivo MIDI
|
||||
snd_seq_t *seq_handle;
|
||||
int portid;
|
||||
if (snd_seq_open(&seq_handle, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) {
|
||||
fprintf(stderr, "Error opening ALSA sequencer.\n");
|
||||
exit(1);
|
||||
}
|
||||
snd_seq_set_client_name(seq_handle, "Teclado");
|
||||
if ((portid = snd_seq_create_simple_port(seq_handle, "keyb",
|
||||
SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ,
|
||||
SND_SEQ_PORT_TYPE_APPLICATION)) < 0) {
|
||||
fprintf(stderr, "Error creating sequencer port.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
snd_seq_event_t ev;
|
||||
snd_seq_ev_clear(&ev);
|
||||
snd_seq_ev_set_source(&ev, 0);
|
||||
snd_seq_ev_set_subs(&ev);
|
||||
snd_seq_ev_set_direct(&ev);
|
||||
|
||||
while (keep_walking) {
|
||||
|
||||
int key = getchar();
|
||||
printf("Pressionou o %d\n", key);
|
||||
switch(key){
|
||||
case 'a':
|
||||
snd_seq_ev_set_noteon(&ev, 0, 60, 127);
|
||||
snd_seq_event_output(seq_handle, &ev);
|
||||
snd_seq_drain_output(seq_handle);
|
||||
usleep(note_on_time / 3);
|
||||
|
||||
snd_seq_ev_set_noteoff(&ev, 0, 60, 0);
|
||||
snd_seq_event_output(seq_handle, &ev);
|
||||
snd_seq_drain_output(seq_handle);
|
||||
break;
|
||||
case 's':
|
||||
snd_seq_ev_set_noteon(&ev, 0, 62, 127);
|
||||
snd_seq_event_output(seq_handle, &ev);
|
||||
snd_seq_drain_output(seq_handle);
|
||||
usleep(note_on_time / 3);
|
||||
|
||||
snd_seq_ev_set_noteoff(&ev, 0, 62, 0);
|
||||
snd_seq_event_output(seq_handle, &ev);
|
||||
snd_seq_drain_output(seq_handle);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
snd_seq_close(seq_handle);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
---
|
||||
author: "Flávio Schiavoni"
|
||||
description: Comunicador Alsa MIDI
|
||||
---
|
||||
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <alsa/asoundlib.h>
|
||||
|
||||
int keep_walking;
|
||||
|
||||
static void sigint_handler(int i){
|
||||
keep_walking = 0;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
int note_time = 1000000; // 1 segundo (em microsegundos)
|
||||
|
||||
// Pega o Ctrl+C ou signal de Kill para a aplicação.
|
||||
signal(SIGINT, &sigint_handler);
|
||||
signal(SIGTERM, &sigint_handler);
|
||||
keep_walking = 1;
|
||||
|
||||
// Crio o dispositivo MIDI
|
||||
snd_seq_t *seq_handle;
|
||||
int portid;
|
||||
if (snd_seq_open(&seq_handle, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) {
|
||||
fprintf(stderr, "Error opening ALSA sequencer.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
snd_seq_set_client_name(seq_handle, "My App Midi");
|
||||
if ((portid = snd_seq_create_simple_port(seq_handle, "My Midi Port",
|
||||
SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ,
|
||||
SND_SEQ_PORT_TYPE_APPLICATION)) < 0) {
|
||||
fprintf(stderr, "Error creating sequencer port.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
snd_seq_event_t ev;
|
||||
snd_seq_ev_clear(&ev);
|
||||
snd_seq_ev_set_source(&ev, 0);
|
||||
snd_seq_ev_set_subs(&ev);
|
||||
snd_seq_ev_set_direct(&ev);
|
||||
|
||||
int value = 0;
|
||||
|
||||
while (keep_walking) {
|
||||
// Note on
|
||||
snd_seq_ev_set_controller(&ev, 0, 0, value);
|
||||
snd_seq_event_output(seq_handle, &ev);
|
||||
snd_seq_drain_output(seq_handle);
|
||||
// Duration
|
||||
usleep(note_time);
|
||||
|
||||
// value = (value < 127) ? value + 1 : 0;
|
||||
|
||||
}
|
||||
|
||||
snd_seq_close(seq_handle);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
author: "Flávio Schiavoni"
|
||||
description: O Blesq Blom!
|
||||
---
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <math.h>
|
||||
|
||||
#define SAMPLE_RATE 44100
|
||||
#define TIME 1 //seconds
|
||||
#define SAMPLE_SIZE 32 // 32 bits float
|
||||
#define PI 3.141592653
|
||||
|
||||
int main(int argc, char ** argv){
|
||||
|
||||
char filename[10];
|
||||
strcpy(filename, "output.wav");
|
||||
|
||||
FILE *fp = fopen(filename,"wb+");
|
||||
|
||||
fwrite("RIFF", 1, 4, fp);
|
||||
int size = SAMPLE_RATE * TIME * SAMPLE_SIZE / 8; // 44100 * 10 seconds * 4 bytes per sample
|
||||
fwrite(&size, 1, sizeof(size), fp);
|
||||
fwrite("WAVE", 1, 4, fp);
|
||||
|
||||
fwrite("fmt ", 1, 4, fp);
|
||||
int flag = 16; // chunk size
|
||||
fwrite(&flag, 1, 4, fp);
|
||||
flag = 0x0003; // compression code
|
||||
fwrite(&flag, 1, 2, fp);
|
||||
flag = 1; // number of channels
|
||||
fwrite(&flag, 1, 2, fp);
|
||||
flag = SAMPLE_RATE; // sample rate
|
||||
fwrite(&flag, 1, 4, fp);
|
||||
flag = SAMPLE_RATE * SAMPLE_SIZE / 8; // bytes per second
|
||||
fwrite(&flag, 1, 4, fp);
|
||||
flag = SAMPLE_SIZE / 8; // block align
|
||||
fwrite(&flag, 1, 2, fp);
|
||||
flag = SAMPLE_SIZE; // significant bits per sample
|
||||
fwrite(&flag, 1, 2, fp);
|
||||
|
||||
fwrite("data", 1, 4, fp);
|
||||
fwrite(&size, 1, 4, fp);
|
||||
|
||||
float buffer[SAMPLE_RATE * TIME];
|
||||
float freq = 440.0f;
|
||||
float step = 2.0f * PI / ((float)SAMPLE_RATE / freq);
|
||||
printf("Step: %f\n", step);
|
||||
|
||||
int i = 0;
|
||||
for(i = 0 ; i < SAMPLE_RATE * TIME; i++){
|
||||
buffer[i] = sin((float)i * step);
|
||||
}
|
||||
|
||||
fwrite(buffer, 1, size, fp);
|
||||
fclose(fp);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
---
|
||||
author: "Flávio Schiavoni"
|
||||
description: O Blesq Blom!
|
||||
---
|
||||
|
||||
#include <stdio.h>
|
||||
#include <portmidi.h>
|
||||
|
||||
#define INPUT_BUFFER_SIZE 100
|
||||
#define OUTPUT_BUFFER_SIZE 0
|
||||
#define DRIVER_INFO NULL
|
||||
#define TIME_PROC ((int32_t (*)(void *)) Pt_Time)
|
||||
#define TIME_INFO NULL
|
||||
#define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
|
||||
|
||||
#define STRING_MAX 80 /* used for console input */
|
||||
#define chord_size 5
|
||||
|
||||
int32_t latency = 0;
|
||||
|
||||
int main(int argc, char* argv) {
|
||||
PmStream * midi;
|
||||
char line[80];
|
||||
int32_t off_time;
|
||||
int chord[] = { 60, 67, 76, 83, 90 };
|
||||
|
||||
PmEvent buffer[chord_size];
|
||||
PmTimestamp timestamp;
|
||||
|
||||
/* determine which output device to use */
|
||||
int i = get_number("Type output number: ");
|
||||
|
||||
/* It is recommended to start timer before PortMidi */
|
||||
TIME_START;
|
||||
|
||||
/* open output device -- since PortMidi avoids opening a timer
|
||||
when latency is zero, we will pass in a NULL timer pointer
|
||||
for that case. If PortMidi tries to access the time_proc,
|
||||
we will crash, so this test will tell us something. */
|
||||
Pm_OpenOutput(&midi,
|
||||
i,
|
||||
DRIVER_INFO,
|
||||
OUTPUT_BUFFER_SIZE,
|
||||
(latency == 0 ? NULL : TIME_PROC),
|
||||
(latency == 0 ? NULL : TIME_INFO),
|
||||
latency);
|
||||
printf("Midi Output opened with %ld ms latency.\n", (long) latency);
|
||||
|
||||
/* output note on/off w/latency offset; hold until user prompts */
|
||||
printf("ready to send program 1 change... (type RETURN):");
|
||||
fgets(line, STRING_MAX, stdin);
|
||||
/* if we were writing midi for immediate output, we could always use
|
||||
timestamps of zero, but since we may be writing with latency, we
|
||||
will explicitly set the timestamp to "now" by getting the time.
|
||||
The source of timestamps should always correspond to the TIME_PROC
|
||||
and TIME_INFO parameters used in Pm_OpenOutput(). */
|
||||
buffer[0].timestamp = TIME_PROC(TIME_INFO);
|
||||
/* Send a program change to increase the chances we will hear notes */
|
||||
/* Program 0 is usually a piano, but you can change it here: */
|
||||
#define PROGRAM 0
|
||||
buffer[0].message = Pm_Message(0xC0, PROGRAM, 0);
|
||||
Pm_Write(midi, buffer, 1);
|
||||
|
||||
printf("ready to note-on... (type RETURN):");
|
||||
fgets(line, STRING_MAX, stdin);
|
||||
buffer[0].timestamp = TIME_PROC(TIME_INFO);
|
||||
buffer[0].message = Pm_Message(0x90, 60, 100);
|
||||
Pm_Write(midi, buffer, 1);
|
||||
printf("ready to note-off... (type RETURN):");
|
||||
fgets(line, STRING_MAX, stdin);
|
||||
buffer[0].timestamp = TIME_PROC(TIME_INFO);
|
||||
buffer[0].message = Pm_Message(0x90, 60, 0);
|
||||
Pm_Write(midi, buffer, 1);
|
||||
|
||||
/* output short note on/off w/latency offset; hold until user prompts */
|
||||
printf("ready to note-on (short form)... (type RETURN):");
|
||||
fgets(line, STRING_MAX, stdin);
|
||||
Pm_WriteShort(midi, TIME_PROC(TIME_INFO),
|
||||
Pm_Message(0x90, 60, 100));
|
||||
printf("ready to note-off (short form)... (type RETURN):");
|
||||
fgets(line, STRING_MAX, stdin);
|
||||
Pm_WriteShort(midi, TIME_PROC(TIME_INFO),
|
||||
Pm_Message(0x90, 60, 0));
|
||||
|
||||
/* output several note on/offs to test timing.
|
||||
Should be 1s between notes */
|
||||
printf("chord will arpeggiate if latency > 0\n");
|
||||
printf("ready to chord-on/chord-off... (type RETURN):");
|
||||
fgets(line, STRING_MAX, stdin);
|
||||
timestamp = TIME_PROC(TIME_INFO);
|
||||
for (i = 0; i < chord_size; i++) {
|
||||
buffer[i].timestamp = timestamp + 1000 * i;
|
||||
buffer[i].message = Pm_Message(0x90, chord[i], 100);
|
||||
}
|
||||
Pm_Write(midi, buffer, chord_size);
|
||||
|
||||
off_time = timestamp + 1000 + chord_size * 1000;
|
||||
while (TIME_PROC(TIME_INFO) < off_time)
|
||||
/* busy wait */;
|
||||
for (i = 0; i < chord_size; i++) {
|
||||
buffer[i].timestamp = timestamp + 1000 * i;
|
||||
buffer[i].message = Pm_Message(0x90, chord[i], 0);
|
||||
}
|
||||
Pm_Write(midi, buffer, chord_size);
|
||||
|
||||
/* close device (this not explicitly needed in most implementations) */
|
||||
printf("ready to close and terminate... (type RETURN):");
|
||||
fgets(line, STRING_MAX, stdin);
|
||||
|
||||
Pm_Close(midi);
|
||||
Pm_Terminate();
|
||||
printf("done closing and terminating...\n");
|
||||
}
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
---
|
||||
author: "Flávio Schiavoni"
|
||||
description: O Blesq Blom!
|
||||
---
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <alsa/asoundlib.h>
|
||||
|
||||
snd_seq_t *open_seq();
|
||||
void midi_action(snd_seq_t *seq_handle);
|
||||
|
||||
snd_seq_t *open_seq() {
|
||||
|
||||
snd_seq_t *seq_handle;
|
||||
int portid;
|
||||
|
||||
if (snd_seq_open(&seq_handle, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) {
|
||||
fprintf(stderr, "Error opening ALSA sequencer.\n");
|
||||
exit(1);
|
||||
}
|
||||
snd_seq_set_client_name(seq_handle, "ALSA Sequencer Demo");
|
||||
if ((portid = snd_seq_create_simple_port(seq_handle, "ALSA Sequencer Demo",
|
||||
SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE,
|
||||
SND_SEQ_PORT_TYPE_APPLICATION)) < 0) {
|
||||
fprintf(stderr, "Error creating sequencer port.\n");
|
||||
exit(1);
|
||||
}
|
||||
return(seq_handle);
|
||||
}
|
||||
|
||||
void midi_action(snd_seq_t *seq_handle) {
|
||||
|
||||
snd_seq_event_t *ev;
|
||||
|
||||
do {
|
||||
snd_seq_event_input(seq_handle, &ev);
|
||||
switch (ev->type) {
|
||||
case SND_SEQ_EVENT_CONTROLLER:
|
||||
fprintf(stderr, "Control event on Channel %2d: %5d \r",
|
||||
ev->data.control.channel, ev->data.control.value);
|
||||
break;
|
||||
case SND_SEQ_EVENT_PITCHBEND:
|
||||
fprintf(stderr, "Pitchbender event on Channel %2d: %5d \r",
|
||||
ev->data.control.channel, ev->data.control.value);
|
||||
break;
|
||||
case SND_SEQ_EVENT_NOTEON:
|
||||
fprintf(stderr, "Note On event on Channel %2d: %5d \r",
|
||||
ev->data.control.channel, ev->data.note.note);
|
||||
break;
|
||||
case SND_SEQ_EVENT_NOTEOFF:
|
||||
fprintf(stderr, "Note Off event on Channel %2d: %5d \r",
|
||||
ev->data.control.channel, ev->data.note.note);
|
||||
break;
|
||||
}
|
||||
snd_seq_free_event(ev);
|
||||
} while (snd_seq_event_input_pending(seq_handle, 0) > 0);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
snd_seq_t *seq_handle;
|
||||
int npfd;
|
||||
struct pollfd *pfd;
|
||||
|
||||
seq_handle = open_seq();
|
||||
npfd = snd_seq_poll_descriptors_count(seq_handle, POLLIN);
|
||||
pfd = (struct pollfd *)alloca(npfd * sizeof(struct pollfd));
|
||||
snd_seq_poll_descriptors(seq_handle, pfd, npfd, POLLIN);
|
||||
while (1) {
|
||||
if (poll(pfd, npfd, 100000) > 0) {
|
||||
midi_action(seq_handle);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,294 @@
|
||||
---
|
||||
author: "Flávio Schiavoni"
|
||||
description:
|
||||
---
|
||||
|
||||
# sudo apt install python3-MIDIUtil
|
||||
from midiutil import MIDIFile
|
||||
|
||||
name = "Generate Midi"
|
||||
keys = ['C','C#','D','D#','E','F','F#','G','G#','A','A#','B']
|
||||
track = 0
|
||||
time = 0 # In beats
|
||||
channel = 0
|
||||
semibreve = 4 # In beats
|
||||
seminima = 1 # In beats
|
||||
colcheia = 0.5 # In beats
|
||||
volume = 100 # 0-127, as per the MIDI standard
|
||||
tempo = 120 # In BPM
|
||||
step = 48
|
||||
|
||||
def gerar_pedal(acordes, mf):
|
||||
global track, channel, time, duration, volume
|
||||
mf.addTrackName(track, time, "Pedal")
|
||||
for i, chord in enumerate(acordes):
|
||||
pitch = keys.index(chord[:1],0) + step
|
||||
if (chord[1:2] == '#'):
|
||||
pitch = pitch + 1
|
||||
if (chord[1:2] == 'b'):
|
||||
pitch = pitch - 1
|
||||
mf.addNote(track, channel, pitch, i*4 + 0, seminima, volume)
|
||||
mf.addNote(track, channel, pitch, i*4 + 1, seminima, volume)
|
||||
mf.addNote(track, channel, pitch, i*4 + 2, seminima, volume)
|
||||
mf.addNote(track, channel, pitch, i*4 + 3, seminima, volume)
|
||||
track = track + 1
|
||||
|
||||
def gerar_tonica(acordes, mf):
|
||||
global track, channel, time, duration, volume
|
||||
mf.addTrackName(track, time, "Tonica")
|
||||
for i, chord in enumerate(acordes):
|
||||
pitch = keys.index(chord[:1],0) + step + 36
|
||||
if (chord[1:2] == '#'):
|
||||
pitch = pitch + 1
|
||||
if (chord[1:2] == 'b'):
|
||||
pitch = pitch - 1
|
||||
print("Tônica: ", chord, pitch)
|
||||
mf.addNote(track, channel, pitch, i*4, semibreve, volume)
|
||||
track = track + 1
|
||||
|
||||
def gerar_quinta(acordes, mf):
|
||||
global track, channel, time, duration, volume
|
||||
mf.addTrackName(track, time, "Quinta")
|
||||
for i, chord in enumerate(acordes):
|
||||
pitch = keys.index(chord[:1],0) + step + 36
|
||||
if (chord[1:2] == '#'):
|
||||
pitch = pitch + 1
|
||||
if (chord[1:2] == 'b'):
|
||||
pitch = pitch - 1
|
||||
pitch = pitch + 7
|
||||
print("Quinta: ", chord, pitch)
|
||||
mf.addNote(track, channel, pitch, i*4, semibreve, volume)
|
||||
track = track + 1
|
||||
|
||||
def gerar_terca(acordes, mf):
|
||||
global track, channel, time, duration, volume
|
||||
mf.addTrackName(track, time, "Terca")
|
||||
for i, chord in enumerate(acordes):
|
||||
pitch = keys.index(chord[:1],0) + step + 36
|
||||
if (chord[1:2] == '#'):
|
||||
pitch = pitch + 1
|
||||
if (chord[1:2] == 'b'):
|
||||
pitch = pitch - 1
|
||||
pitch = pitch + 4
|
||||
if ("m" in chord):
|
||||
pitch = pitch - 1
|
||||
print("terça: ", chord, pitch)
|
||||
mf.addNote(track, channel, pitch, i*4, semibreve, volume)
|
||||
track = track + 1
|
||||
|
||||
def gerar_acordes(acordes, mf):
|
||||
global track, channel, time, duration, volume
|
||||
mf.addTrackName(track, time, "acordes")
|
||||
for i, chord in enumerate(acordes):
|
||||
pitch = keys.index(chord[:1],0) + step + 24
|
||||
if (chord[1:2] == '#'):
|
||||
pitch = pitch + 1
|
||||
if (chord[1:2] == 'b'):
|
||||
pitch = pitch - 1
|
||||
mf.addNote(track, channel, pitch, i*4, semibreve, volume)
|
||||
quinta = pitch + 7
|
||||
mf.addNote(track, channel, quinta, i*4, semibreve, volume)
|
||||
terca = pitch + 4
|
||||
if ("m" in chord):
|
||||
terca = terca - 1
|
||||
mf.addNote(track, channel, terca, i*4, semibreve, volume)
|
||||
track = track + 1
|
||||
|
||||
def gerar_reaggae(acordes, mf):
|
||||
global track, channel, time, duration, volume
|
||||
mf.addTrackName(track, time, "reggae")
|
||||
for i, chord in enumerate(acordes):
|
||||
pitch = keys.index(chord[:1],0) + step + 24
|
||||
if (chord[1:2] == '#'):
|
||||
pitch = pitch + 1
|
||||
if (chord[1:2] == 'b'):
|
||||
pitch = pitch - 1
|
||||
quinta = pitch + 7
|
||||
terca = pitch + 4
|
||||
if ("m" in chord):
|
||||
terca = terca - 1
|
||||
mf.addNote(track, channel, pitch, i*4 + 1, seminima, volume)
|
||||
mf.addNote(track, channel, pitch, i*4 + 3, seminima, volume)
|
||||
mf.addNote(track, channel, terca, i*4 + 1, seminima, volume)
|
||||
mf.addNote(track, channel, terca, i*4 + 3, seminima, volume)
|
||||
mf.addNote(track, channel, quinta, i*4 + 1, seminima, volume)
|
||||
mf.addNote(track, channel, quinta, i*4 + 3, seminima, volume)
|
||||
track = track + 1
|
||||
|
||||
def gerar_baixo1(acordes, mf):
|
||||
global track, channel, time, duration, volume
|
||||
mf.addTrackName(track, time, "Baixo1")
|
||||
for i, chord in enumerate(acordes):
|
||||
pitch = keys.index(chord[:1],0) + step + 12
|
||||
if (chord[1:2] == '#'):
|
||||
pitch = pitch + 1
|
||||
if (chord[1:2] == 'b'):
|
||||
pitch = pitch - 1
|
||||
quinta = pitch + 7
|
||||
terca = pitch + 4
|
||||
if ("m" in chord):
|
||||
terca = terca - 1
|
||||
mf.addNote(track, channel, pitch, i*4 + 0, seminima + colcheia, volume)
|
||||
mf.addNote(track, channel, terca, i*4 + 1.5, colcheia, volume)
|
||||
mf.addNote(track, channel, quinta, i*4 + 2, seminima, volume)
|
||||
mf.addNote(track, channel, pitch, i*4 + 3, seminima, volume)
|
||||
track = track + 1
|
||||
|
||||
def gerar_baixo2(acordes, mf):
|
||||
global track, channel, time, duration, volume
|
||||
mf.addTrackName(track, time, "Baixo2")
|
||||
for i, chord in enumerate(acordes):
|
||||
pitch = keys.index(chord[:1],0) + step + 12
|
||||
mf.addNote(track, channel, pitch, i*4 + 0, seminima, volume)
|
||||
mf.addNote(track, channel, pitch + 7, i*4 + 1, seminima, volume)
|
||||
mf.addNote(track, channel, pitch, i*4 + 2, seminima, volume)
|
||||
mf.addNote(track, channel, pitch + 7, i*4 + 3, seminima, volume)
|
||||
track = track + 1
|
||||
|
||||
def gerar_baixo3(acordes, mf):
|
||||
global track, channel, time, duration, volume
|
||||
mf.addTrackName(track, time, "Baixo3")
|
||||
for i, chord in enumerate(acordes):
|
||||
pitch = keys.index(chord[:1],0) + step + 12
|
||||
mf.addNote(track, channel, pitch, i*4 + 0, colcheia, volume)
|
||||
mf.addNote(track, channel, pitch + 7, i*4 + 0.5, colcheia, volume)
|
||||
mf.addNote(track, channel, pitch, i*4 + 1, colcheia, volume)
|
||||
mf.addNote(track, channel, pitch + 7, i*4 + 1.5, colcheia, volume)
|
||||
mf.addNote(track, channel, pitch, i*4 + 2, colcheia, volume)
|
||||
mf.addNote(track, channel, pitch + 7, i*4 + 2.5, colcheia, volume)
|
||||
mf.addNote(track, channel, pitch, i*4 + 3, colcheia, volume)
|
||||
mf.addNote(track, channel, pitch + 7, i*4 + 3.5, colcheia, volume)
|
||||
track = track + 1
|
||||
|
||||
|
||||
def gerar_bateria1(acordes, mf):
|
||||
global track, channel, time, duration, volume
|
||||
mf.addTrackName(track, time, "Bateria1")
|
||||
# Bumbo
|
||||
mf.addNote(track, channel, 48, 0, seminima, volume)
|
||||
mf.addNote(track, channel, 48, 4, seminima, volume)
|
||||
# Caixa
|
||||
mf.addNote(track, channel, 53, 2, seminima, volume)
|
||||
mf.addNote(track, channel, 53, 6, seminima, volume)
|
||||
# Cimbal
|
||||
mf.addNote(track, channel, 60, 0, colcheia, volume + 10)
|
||||
mf.addNote(track, channel, 61, 0.5, colcheia, volume - 10)
|
||||
mf.addNote(track, channel, 60, 1, colcheia, volume)
|
||||
mf.addNote(track, channel, 62, 1.5, colcheia, volume + 10)
|
||||
mf.addNote(track, channel, 61, 2, colcheia, volume - 10)
|
||||
mf.addNote(track, channel, 60, 2.5, colcheia, volume)
|
||||
mf.addNote(track, channel, 61, 3, colcheia, volume + 10)
|
||||
mf.addNote(track, channel, 62, 3.5, colcheia, volume - 10)
|
||||
mf.addNote(track, channel, 60, 4, colcheia, volume - 10)
|
||||
mf.addNote(track, channel, 61, 4.5, colcheia, volume + 10)
|
||||
mf.addNote(track, channel, 60, 5, colcheia, volume)
|
||||
mf.addNote(track, channel, 61, 5.5, colcheia, volume - 10)
|
||||
mf.addNote(track, channel, 62, 6, colcheia, volume + 10)
|
||||
mf.addNote(track, channel, 60, 6.5, colcheia, volume - 10)
|
||||
mf.addNote(track, channel, 61, 7, colcheia, volume - 10)
|
||||
mf.addNote(track, channel, 62, 7.5, colcheia, volume)
|
||||
track = track + 1
|
||||
|
||||
def gerar_bateria2(acordes, mf):
|
||||
global track, channel, time, duration, volume
|
||||
mf.addTrackName(track, time, "Bateria2")
|
||||
# Bumbo
|
||||
mf.addNote(track, channel, 48, 0, seminima, volume)
|
||||
mf.addNote(track, channel, 48, 2, colcheia, volume)
|
||||
mf.addNote(track, channel, 48, 2.5, colcheia, volume)
|
||||
mf.addNote(track, channel, 48, 4, seminima, volume)
|
||||
mf.addNote(track, channel, 48, 6, colcheia, volume)
|
||||
mf.addNote(track, channel, 48, 6.5, colcheia, volume)
|
||||
# Caixa
|
||||
mf.addNote(track, channel, 53, 1, seminima, volume)
|
||||
mf.addNote(track, channel, 53, 3, seminima, volume)
|
||||
mf.addNote(track, channel, 53, 5, seminima, volume)
|
||||
mf.addNote(track, channel, 53, 7, seminima, volume)
|
||||
# Cimbal
|
||||
mf.addNote(track, channel, 60, 0, colcheia, volume + 10)
|
||||
mf.addNote(track, channel, 61, 0.5, colcheia, volume - 10)
|
||||
mf.addNote(track, channel, 60, 1, colcheia, volume)
|
||||
mf.addNote(track, channel, 62, 1.5, colcheia, volume + 10)
|
||||
mf.addNote(track, channel, 61, 2, colcheia, volume - 10)
|
||||
mf.addNote(track, channel, 60, 2.5, colcheia, volume)
|
||||
mf.addNote(track, channel, 61, 3, colcheia, volume + 10)
|
||||
mf.addNote(track, channel, 62, 3.5, colcheia, volume - 10)
|
||||
mf.addNote(track, channel, 60, 4, colcheia, volume - 10)
|
||||
mf.addNote(track, channel, 61, 4.5, colcheia, volume + 10)
|
||||
mf.addNote(track, channel, 60, 5, colcheia, volume)
|
||||
mf.addNote(track, channel, 61, 5.5, colcheia, volume - 10)
|
||||
mf.addNote(track, channel, 62, 6, colcheia, volume + 10)
|
||||
mf.addNote(track, channel, 60, 6.5, colcheia, volume - 10)
|
||||
mf.addNote(track, channel, 61, 7, colcheia, volume - 10)
|
||||
mf.addNote(track, channel, 62, 7.5, colcheia, volume)
|
||||
track = track + 1
|
||||
|
||||
def gerar_percussao(acordes, mf):
|
||||
global track, channel, time, duration, volume
|
||||
mf.addTrackName(track, time, "Percussao")
|
||||
# Bumbo
|
||||
mf.addNote(track, channel, 72, 0, seminima, volume)
|
||||
mf.addNote(track, channel, 73, 0.5, seminima, volume)
|
||||
mf.addNote(track, channel, 73, 3, seminima, volume)
|
||||
mf.addNote(track, channel, 72, 3.5, seminima, volume)
|
||||
mf.addNote(track, channel, 73, 5, seminima, volume)
|
||||
mf.addNote(track, channel, 72, 5.5, seminima, volume)
|
||||
mf.addNote(track, channel, 72, 6.5, seminima, volume)
|
||||
track = track + 1
|
||||
|
||||
def gerar_percussao2(acordes, mf):
|
||||
global track, channel, time, duration, volume
|
||||
mf.addTrackName(track, time, "Percussao 2")
|
||||
# Bumbo
|
||||
mf.addNote(track, channel, 77, 0.5, colcheia, volume)
|
||||
mf.addNote(track, channel, 78, 1.5, colcheia, volume)
|
||||
mf.addNote(track, channel, 79, 2, colcheia, volume)
|
||||
mf.addNote(track, channel, 77, 2.5, colcheia, volume)
|
||||
mf.addNote(track, channel, 79, 3, colcheia, volume)
|
||||
track = track + 1
|
||||
|
||||
mf = MIDIFile(13, deinterleave=True) # One track, defaults to format 1 (tempo track is created
|
||||
|
||||
# name = "Alagados"
|
||||
# acordes = ['A', 'A', 'E', 'D']
|
||||
# mf.addTempo(track, time, 200)
|
||||
|
||||
# name = "Vapor Barato"
|
||||
# acordes = ['Am', 'Am', 'G', 'G', 'F', 'F', 'Dm', 'E']
|
||||
# mf.addTempo(track, time, 132)
|
||||
|
||||
# name = "Hey Joe"
|
||||
# acordes = ['C', 'G', 'D', 'A', 'E', 'E', 'E', 'E']
|
||||
# mf.addTempo(track, time, 132)
|
||||
|
||||
# name = "Ainda é cedo"
|
||||
# acordes = ['Dm', 'C', 'Am', 'Am']
|
||||
# mf.addTempo(track, time, 132)
|
||||
|
||||
# name = "Creep"
|
||||
# acordes = ['G', 'G', 'B', 'B', 'C', 'C', 'Cm', 'Cm']
|
||||
# mf.addTempo(track, time, 100)
|
||||
|
||||
# name = "Não chores mais"
|
||||
# acordes = ['C', 'G', 'Am', 'F']
|
||||
# mf.addTempo(track, time, 100)
|
||||
|
||||
name = "Naquela Mesa"
|
||||
acordes = ['Am', 'Am', 'Am', 'Dm', 'Dm', 'Dm', 'Dm', 'Am', 'Am', 'Am', 'A', 'Dm', 'Dm', 'Am', 'E', 'Am']
|
||||
mf.addTempo(track, time, 100)
|
||||
|
||||
gerar_bateria1(acordes,mf)
|
||||
gerar_bateria2(acordes,mf)
|
||||
gerar_percussao(acordes,mf)
|
||||
gerar_percussao2(acordes,mf)
|
||||
gerar_tonica(acordes,mf)
|
||||
gerar_quinta(acordes,mf)
|
||||
gerar_terca(acordes,mf)
|
||||
gerar_acordes(acordes,mf)
|
||||
gerar_reaggae(acordes,mf)
|
||||
gerar_pedal(acordes,mf)
|
||||
gerar_baixo1(acordes,mf)
|
||||
gerar_baixo2(acordes,mf)
|
||||
gerar_baixo3(acordes,mf)
|
||||
with open(name + ".mid", "wb") as output_file:
|
||||
mf.writeFile(output_file)
|
||||
@@ -0,0 +1,333 @@
|
||||
---
|
||||
author: "Flávio Schiavoni"
|
||||
description:
|
||||
---
|
||||
|
||||
from __future__ import print_function
|
||||
from unittest import TestCase
|
||||
|
||||
|
||||
class NoteEvent(TestCase):
|
||||
|
||||
def test(self):
|
||||
from alsamidi import noteevent
|
||||
|
||||
midi_event = (1, 60, 127, 1000, 10)
|
||||
data = (1, 60, 127, 0, 10)
|
||||
expected = (5, 1, 0, 0, (1, 0), (0, 0), (0, 0), data)
|
||||
self.assertEqual(expected, noteevent(*midi_event))
|
||||
|
||||
|
||||
class NoteOnEvent(TestCase):
|
||||
|
||||
def test(self):
|
||||
from alsamidi import noteonevent
|
||||
|
||||
midi_event = (1, 60, 127)
|
||||
data = (1, 60, 127, 0, 0)
|
||||
expected = (6, 1, 0, 253, (0, 0), (0, 0), (0, 0), data)
|
||||
self.assertEqual(expected, noteonevent(*midi_event))
|
||||
|
||||
|
||||
class NoteOffEvent(TestCase):
|
||||
|
||||
def test(self):
|
||||
from alsamidi import noteoffevent
|
||||
|
||||
midi_event = (1, 60, 10)
|
||||
data = (1, 60, 10, 0, 0)
|
||||
expected = (7, 1, 0, 253, (0, 0), (0, 0), (0, 0), data)
|
||||
self.assertEqual(expected, noteoffevent(*midi_event))
|
||||
|
||||
|
||||
class PgmChangeEvent(TestCase):
|
||||
|
||||
def test_sent_directly(self):
|
||||
from alsamidi import pgmchangeevent
|
||||
|
||||
data = (1, 0, 0, 0, 0, 9)
|
||||
expected = (11, 1, 0, 253, (0, 0), (0, 0), (0, 0), data)
|
||||
self.assertEqual(expected, pgmchangeevent(1, 9))
|
||||
|
||||
def test_scheduled(self):
|
||||
from alsamidi import pgmchangeevent
|
||||
|
||||
data = (1, 0, 0, 0, 0, 9)
|
||||
expected = (11, 1, 0, 0, (1, 0), (0, 0), (0, 0), data)
|
||||
self.assertEqual(expected, pgmchangeevent(1, 9, 1000))
|
||||
|
||||
|
||||
class PitchbendEvent(TestCase):
|
||||
|
||||
def test_sent_directly(self):
|
||||
from alsamidi import pitchbendevent
|
||||
|
||||
data = (1, 0, 9)
|
||||
expected = (13, 1, 0, 253, (0, 0), (0, 0), (0, 0), data)
|
||||
self.assertEqual(expected, pitchbendevent(1, 9))
|
||||
|
||||
def test_scheduled(self):
|
||||
from alsamidi import pitchbendevent
|
||||
|
||||
data = (1, 0, 9)
|
||||
expected = (13, 1, 0, 0, (1, 0), (0, 0), (0, 0), data)
|
||||
self.assertEqual(expected, pitchbendevent(1, 9, 1000))
|
||||
|
||||
|
||||
class ChanPress(TestCase):
|
||||
|
||||
def test_sent_directly(self):
|
||||
from alsamidi import chanpress
|
||||
|
||||
data = (1, 0, 9)
|
||||
expected = (12, 1, 0, 253, (0, 0), (0, 0), (0, 0), data)
|
||||
self.assertEqual(expected, chanpress(1, 9))
|
||||
|
||||
def test_scheduled(self):
|
||||
from alsamidi import chanpress
|
||||
|
||||
data = (1, 0, 9)
|
||||
expected = (12, 1, 0, 0, (1, 0), (0, 0), (0, 0), data)
|
||||
self.assertEqual(expected, chanpress(1, 9, 1000))
|
||||
|
||||
|
||||
class Tuple2Time(TestCase):
|
||||
|
||||
def test(self):
|
||||
from alsamidi import tuple2time
|
||||
|
||||
self.assertEqual(1.5, tuple2time((1, 500000000)))
|
||||
|
||||
|
||||
class Time2Tuple(TestCase):
|
||||
|
||||
def test(self):
|
||||
from alsamidi import time2tuple
|
||||
|
||||
self.assertEqual((1, 500000000), time2tuple(1.5))
|
||||
|
||||
|
||||
class ModifyEvent(TestCase):
|
||||
|
||||
def test(self):
|
||||
from alsamidi import modifyevent
|
||||
|
||||
data = (1, 60, 127, 0, 10)
|
||||
event = (5, 1, 0, 0, (1, 0), (0, 0), (0, 0), data)
|
||||
modified_data = (15, 72, 127, 0, 10)
|
||||
modified_event = (5, 1, 0, 250, (2, 0), (2, 0), (3, 0), modified_data)
|
||||
self.assertEqual(modified_event, modifyevent(event, timedelta=1,
|
||||
ch=15, dest=(3, 0), source=(2, 0), queue=250, keydelta=12))
|
||||
|
||||
|
||||
class ModifyEvents(TestCase):
|
||||
|
||||
def test(self):
|
||||
from alsamidi import modifyevents
|
||||
|
||||
data = (1, 60, 127, 0, 10)
|
||||
event = (5, 1, 0, 0, (1, 0), (0, 0), (0, 0), data)
|
||||
modified_data = (15, 72, 127, 0, 10)
|
||||
modified_event = (5, 1, 0, 250, (2, 0), (2, 0), (3, 0), modified_data)
|
||||
self.assertEqual([modified_event], modifyevents([event], timedelta=1,
|
||||
ch=15, dest=(3, 0), source=(2, 0), queue=250, keydelta=12))
|
||||
|
||||
|
||||
class Merge(TestCase):
|
||||
|
||||
def test_no_tracks(self):
|
||||
from alsamidi import merge
|
||||
|
||||
self.assertEqual([], merge([]))
|
||||
|
||||
def test_track(self):
|
||||
from alsamidi import merge
|
||||
|
||||
event = (0, 0, 0, 0, 0)
|
||||
self.assertEqual([event], merge([[event]]))
|
||||
|
||||
|
||||
class UniqueNotes(TestCase):
|
||||
|
||||
def test(self):
|
||||
from alsamidi import uniquenotes
|
||||
|
||||
data = (1, 60, 127, 0, 10)
|
||||
event = (5, 1, 0, 0, (1, 0), (0, 0), (0, 0), data)
|
||||
expected = {1: [60]}
|
||||
self.assertEqual(expected, uniquenotes([event]))
|
||||
|
||||
|
||||
class TestSeq(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
try:
|
||||
from mock import Mock
|
||||
except:
|
||||
from unittest.mock import Mock
|
||||
import alsamidi
|
||||
|
||||
alsamidi.print = Mock()
|
||||
|
||||
def tearDown(self):
|
||||
import alsamidi
|
||||
|
||||
del alsamidi.print
|
||||
|
||||
def test_instance(self):
|
||||
from alsamidi import Seq
|
||||
|
||||
self.assertTrue(isinstance(Seq(), Seq))
|
||||
|
||||
def test_info(self):
|
||||
from alsamidi import Seq
|
||||
import alsamidi
|
||||
|
||||
data = (9, 60, 127, 0, 10)
|
||||
event = (5, 1, 0, 0, (1, 0), (0, 0), (0, 0), data)
|
||||
track = [event]
|
||||
|
||||
seq = Seq()
|
||||
seq.names = ['name']
|
||||
seq.tags = 'tags'
|
||||
seq.tracks = [track]
|
||||
seq.info()
|
||||
alsamidi.print.assert_any_call('tags')
|
||||
args = '0:', 'name ', 0, 'Sec.', 1, 'events,', {9: [60]}, 'Hi Bongo'
|
||||
alsamidi.print.assert_called_with(*args)
|
||||
|
||||
|
||||
class SeqRead(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
import os
|
||||
try:
|
||||
from mock import Mock
|
||||
except:
|
||||
from unittest.mock import Mock
|
||||
import alsamidi
|
||||
|
||||
self.file = Mock()
|
||||
text = 'track melody\n' \
|
||||
'6,1,0,1,2 5430786,20 0,130 0,1 108 82 0 0\n' \
|
||||
'name = value'
|
||||
lines = text.split('\n')
|
||||
self.file.readlines.return_value = lines
|
||||
lines[0] = lines[0] + '\n'
|
||||
alsamidi.open = Mock(return_value=self.file)
|
||||
|
||||
alsamidi.print = Mock()
|
||||
|
||||
self.exits = os.path.exists
|
||||
os.path.exists = Mock(return_value=True)
|
||||
|
||||
def tearDown(self):
|
||||
import os
|
||||
import alsamidi
|
||||
|
||||
del alsamidi.open
|
||||
del alsamidi.print
|
||||
|
||||
def test_read_not_found(self):
|
||||
import os
|
||||
from alsamidi import Seq
|
||||
|
||||
os.path.exists.return_value = False
|
||||
seq = Seq()
|
||||
seq.read('path')
|
||||
self.assertEqual([], seq.tracks)
|
||||
|
||||
def test_read_named_track(self):
|
||||
from alsamidi import Seq
|
||||
|
||||
seq = Seq()
|
||||
seq.read('path')
|
||||
self.assertEqual(['track melody'], seq.names)
|
||||
|
||||
def test_read_default_track(self):
|
||||
from alsamidi import Seq
|
||||
|
||||
text = '6,1,0,1,2 5430786,20 0,130 0,1 108 82 0 0'
|
||||
|
||||
self.file.readlines.return_value = text.split('\n')
|
||||
seq = Seq()
|
||||
seq.read('path')
|
||||
self.assertEqual(['Default'], seq.names)
|
||||
|
||||
def test_read_track(self):
|
||||
from alsamidi import Seq
|
||||
|
||||
seq = Seq()
|
||||
seq.read('path')
|
||||
self.assertEqual([[
|
||||
(6, 1, 0, 1,
|
||||
(2, 5430786),
|
||||
(20, 0),
|
||||
(130, 0), (1, 108, 82, 0, 0))]], seq.tracks)
|
||||
|
||||
|
||||
class SeqWrite(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
try:
|
||||
from mock import Mock
|
||||
except:
|
||||
from unittest.mock import Mock
|
||||
import alsamidi
|
||||
|
||||
self.file = Mock()
|
||||
alsamidi.open = Mock(return_value=self.file)
|
||||
|
||||
alsamidi.print = Mock()
|
||||
|
||||
def tearDown(self):
|
||||
import alsamidi
|
||||
|
||||
del alsamidi.open
|
||||
del alsamidi.print
|
||||
|
||||
def test_write(self):
|
||||
from alsamidi import Seq
|
||||
|
||||
data = (9, 60, 127, 0, 10)
|
||||
event = (5, 1, 0, 0, (1, 0), (0, 0), (0, 0), data)
|
||||
track = [event]
|
||||
|
||||
seq = Seq()
|
||||
seq.names = ['name']
|
||||
seq.tags = {'name': 'value'}
|
||||
seq.orderedtags = ['name']
|
||||
seq.tracks = [track]
|
||||
|
||||
seq.write('path')
|
||||
line = '5,1,0,0,1 0,0 0,0 0,9 60 127 0 10\n'
|
||||
self.file.write.assert_called_with(line)
|
||||
|
||||
def test_write_no_name(self):
|
||||
from alsamidi import Seq
|
||||
|
||||
data = (9, 60, 127, 0, 10)
|
||||
event = (5, 1, 0, 0, (1, 0), (0, 0), (0, 0), data)
|
||||
track = [event]
|
||||
|
||||
seq = Seq()
|
||||
seq.names = []
|
||||
seq.tags = {'name': 'value'}
|
||||
seq.orderedtags = ['name']
|
||||
seq.tracks = [track]
|
||||
|
||||
seq.write('path')
|
||||
line = '5,1,0,0,1 0,0 0,0 0,9 60 127 0 10\n'
|
||||
self.file.write.assert_called_with(line)
|
||||
|
||||
def test_error(self):
|
||||
from alsamidi import Seq
|
||||
import alsamidi
|
||||
|
||||
alsamidi.open.side_effect = IOError
|
||||
seq = Seq()
|
||||
seq.write('path')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
Reference in new issue
Block a user