[C言語]MIDI

MIDIとはMusical Instrument Digital Interface, 電子機器の演奏データを機器間で転送・共有するための共通規格


ん? なんだこれは?

#include 
#include 

typedef struct {   // typedefはtype definition 構造体
	char type[4];
	int size; // トラックチャンクデータのサイズ[4byte]
	char *data;
} TrackChunk;

short mergeChar7bit(char x, char y){
	short s;
	s = (unsigned char)x;
	s <<= 7;
	s = (s |(unsigned char)(y & 0x7f));
	return s;
}

int convertEndian(void *input, size_t s){
	int i;
	char *temp;

	if((temp = (char *)calloc(s, sizeof(char))) == NULL){
		perror("Error: Cannot get money for temp.");
		return 0;
	}

	for(i=0; i

$ gcc -o main main.c
main.c: In function ‘main’:
main.c:64:3: warning: implicit declaration of function ‘eperror’; did you mean ‘perror’? [-Wimplicit-function-declaration]
eperror("Error:Cannot open the file.");
^~~~~~~
perror
main.c:147:5: error: ‘jLL’ undeclared (first use in this function); did you mean ‘NULL’?
jLL;
^~~
NULL
main.c:147:5: note: each undeclared identifier is reported only once for each function it appears in
main.c:317:13: warning: too many arguments for format [-Wformat-extra-args]
printf(")=%d",c,(unsigned char)track_chunks[i].data[j]);
^~~~~~
main.c:319:12: warning: zero-length gnu_printf format string [-Wformat-zero-length]
printf("");
^~
main.c:334:15: error: ‘statu’ undeclared (first use in this function); did you mean ‘status’?
} else if((statu & 0xf0) == 0xf0){
^~~~~
status
main.c:335:5: warning: implicit declaration of function ‘swtich’ [-Wimplicit-function-declaration]
swtich(status & 0x0f){
^~~~~~
main.c:335:26: error: expected ‘;’ before ‘{’ token
swtich(status & 0x0f){
^
main.c:573:22: error: invalid suffix "O" on integer constant
switch(cnt & 0xCO){
^~~~
main.c:645:11: warning: zero-length gnu_printf format string [-Wformat-zero-length]
printf("");

..$ gcc -o main main.c
main.c: In function ‘main’:
main.c:64:3: warning: implicit declaration of function ‘eperror’; did you mean ‘perror’? [-Wimplicit-function-declaration]
eperror("Error:Cannot open the file.");
^~~~~~~
perror
main.c:147:5: error: ‘jLL’ undeclared (first use in this function); did you mean ‘NULL’?
jLL;
^~~
NULL
main.c:147:5: note: each undeclared identifier is reported only once for each function it appears in
main.c:317:13: warning: too many arguments for format [-Wformat-extra-args]
printf(")=%d",c,(unsigned char)track_chunks[i].data[j]);
^~~~~~
main.c:319:12: warning: zero-length gnu_printf format string [-Wformat-zero-length]
printf("");
^~
main.c:334:15: error: ‘statu’ undeclared (first use in this function); did you mean ‘status’?
} else if((statu & 0xf0) == 0xf0){
^~~~~
status
main.c:335:5: warning: implicit declaration of function ‘swtich’ [-Wimplicit-function-declaration]
swtich(status & 0x0f){
^~~~~~
main.c:335:26: error: expected ‘;’ before ‘{’ token
swtich(status & 0x0f){
^
main.c:573:22: error: invalid suffix "O" on integer constant
switch(cnt & 0xCO){
^~~~
main.c:645:11: warning: zero-length gnu_printf format string [-Wformat-zero-length]
printf("");

シューティングゲーム

#include "display.h"

void displayMain(){
	glClear(GL_COLOR_BUFFER_BIT);

	float test1 = 1.0f;
	int test2 = 23;

	// font test
	fontBegin();
	fontSetPosition(0.0, 100.0);
	fontSetSize(FONT_DEFAULT_SIZE * 0.25);
	fontSetWeight(1.0);
	fontSetColor(0, 0, 255);
	fontDraw("float:%f, int:%d", test1, test2);
	fontEnd();

	glutSwapBuffers();
}
#ifndef __HEADER_FONT
#define __HEADER_FONT

#define FONT_DEFAULT_SIZE (100.0f)

void fontBegin();
void fontEnd();

void fontSetPosition(float _x, float _y);
void fontSetSize(float _size);
void fontSetWeight(float _weight);
void fontSetColor(unsigined char _red, unsigned char _green, unsigned char _blue);
void fontDraw(const char *format, ...);

#endif
#include "font.h"

#include <GL/glut.h>
#include <stdio.h>
#include <stdarg.h> // 可変長引数の関数を実装

static float positionX;  // staticは静的記憶クラス
static float positionY;
static float size = FONT_DEFAULT_SIZE;
static float weight = 1.0;

void fontBegin(){
	glPushMatrix();
	glPushAttrib(GL_ALL_ATTRIB_BITS);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	GLint viewport[4];
	glGetIntegerv(GL_VIEWPORT, viewport);
	gluOrtho2D(0, viewport[2], viewport[3], 0); 

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void fontEnd(){
	glPopMatrix();
	glPopAttrib();
}

void fontSetPosition(float _x, float _y){
	positionX = _x;
	positionY = _y;
}

void fontSetSize(float _size){
	size = _size;
}

void fontSetWeight(float _weight){
	weight = _weight;
}

void fontSetColor(unsigned char _red, unsigned char _green, unsigned char _blue){
	color[0] = red;
	color[1] = green;
	color[2] = blue;
}

void fontDraw(const char *format, ...){
	va_list argList;
	va_start(argList, format);
	char str[256];
	vsprintf(str, format, argList);
	va_end(argList);

	glLineWidth(weight);
	glColor3ub(color[0], color[1], color[2]);
	glPushMatrix();

	glTranslatef(positionX, positionY + size, 0.0);
	float s = size / FONT_DEFAULT_SIZE;
	glScalef(s, -s, s);
	for(char *p = str; *p != '\0'; p++)
		glutStrokeCharacter(CLUT_STROKE_ROMAN, *p);

	glPopMatrix();
}
main: main.c game.o display.o font.o
	gcc main.c game.o display.o font.o -o main -lglut -lGLU -lGL

game.o: game.c game.h define.h display.h
	gcc -c game.c -o game.o -lglut -lGLU -lGL 

display.o: display.c display.h
	gcc -c display.c -o display.o -lglut -lGLU -lGL

font.o: font.c font.h
	gcc -c font.c -o font.o -lglut -lGLU -lGL

clean:
	rm -rf main *.o

$ make
gcc -c display.c -o display.o -lglut -lGLU -lGL
display.c: In function ‘displayMain’:
display.c:4:2: warning: implicit declaration of function ‘glClear’ [-Wimplicit-function-declaration]
glClear(GL_COLOR_BUFFER_BIT);
^~~~~~~
display.c:4:10: error: ‘GL_COLOR_BUFFER_BIT’ undeclared (first use in this function)
glClear(GL_COLOR_BUFFER_BIT);
^~~~~~~~~~~~~~~~~~~
display.c:4:10: note: each undeclared identifier is reported only once for each function it appears in
display.c:10:2: warning: implicit declaration of function ‘fontBegin’ [-Wimplicit-function-declaration]
fontBegin();
^~~~~~~~~
display.c:11:2: warning: implicit declaration of function ‘fontSetPosition’ [-Wimplicit-function-declaration]
fontSetPosition(0.0, 100.0);
^~~~~~~~~~~~~~~
display.c:12:2: warning: implicit declaration of function ‘fontSetSize’ [-Wimplicit-function-declaration]
fontSetSize(FONT_DEFAULT_SIZE * 0.25);
^~~~~~~~~~~
display.c:12:14: error: ‘FONT_DEFAULT_SIZE’ undeclared (first use in this function)
fontSetSize(FONT_DEFAULT_SIZE * 0.25);
^~~~~~~~~~~~~~~~~
display.c:13:2: warning: implicit declaration of function ‘fontSetWeight’ [-Wimplicit-function-declaration]
fontSetWeight(1.0);
^~~~~~~~~~~~~
display.c:14:2: warning: implicit declaration of function ‘fontSetColor’ [-Wimplicit-function-declaration]
fontSetColor(0, 0, 255);
^~~~~~~~~~~~
display.c:15:2: warning: implicit declaration of function ‘fontDraw’ [-Wimplicit-function-declaration]
fontDraw(“float:%f, int:%d”, test1, test2);
^~~~~~~~
display.c:16:2: warning: implicit declaration of function ‘fontEnd’ [-Wimplicit-function-declaration]
fontEnd();
^~~~~~~
display.c:18:2: warning: implicit declaration of function ‘glutSwapBuffers’ [-Wimplicit-function-declaration]
glutSwapBuffers();
^~~~~~~~~~~~~~~
GNUmakefile:8: recipe for target ‘display.o’ failed
make: *** [display.o] Error 1

何故だーーーーーー

[C言語]Makefile2

main.c // 初期化、ゲーム実行処理

#include "game.h"

int main(int argc, char *argv[]){ // コマンドライン引数 int argcは引数の個数、char *argvは引数の文字列
	gameInit(&argc, argv);

	gameRun();

	return 0;
}

game.h

#ifndef __HEADER_GAME

#define __HEADER_GAME

void gameInit(int *argc, char **argv);
void gameRun();

#endif

game.c  // glut初期化 ※glInit

#include "game.h"

#include <GL/glut.h>
#include "define.h"
#include "display.h"

void glInit(int *argc, char **argv);

void gameInit(int *argc, char **argv){
	glInit(argc, argv);
}

void gameRun(){
	glutMainLoop();
}

void glInit(int *argc, char **argv){
	glutInit(argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
	glutCreateWindow("myGame");
	glutDisplayFunc(displayMain);
}

define.h

#ifndef __HEADER_DEFINE

#define __HEADER_DEFINE

#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 480

#endif

display.h

#ifndef __HEADER_DISPLAY

#define __HEADER_DISPLAY

void displayMain();

#endif

display.c  // ゲーム処理

#include "display.h"

void displayMain(){
	
}

GNUmakefile // コンパイル

main: main.c game.o display.o
	gcc main.c game.o display.o -o main -lglut -lGLU -lGL

game.o: game.c game.h define.h display.h
	gcc -c game.c -o game.o -lglut -lGLU -lGL 

display.o: display.c display.h
	gcc -c display.c -o display.o -lglut -lGLU -lGL

clean:
	rm -rf main *.o

$ make
gcc -c game.c -o game.o -lglut -lGLU -lGL
gcc -c display.c -o display.o -lglut -lGLU -lGL
gcc main.c game.o display.o -o main -lglut -lGLU -lGL

[C言語]Makefile

各ファイルとコンパイルに必要なコマンド、ファイル間の依存関係を書く

makeの種類
– Microsoft nmake (Windows)
– Borland make (Windows)
– GNU make (windows, UNIX 系)
– Solaris make (Solaris)

hello.c

#include <stdio.h>

int main(int argc, char *argv[]){
	printf("Hello C\n");
	return 0;
}

GNUmakefile

hello: hello.c
	gcc -Wall -O2 -o hello hello.c

依存関係行

hello: hello.c
	gcc -Wall -O2 -o hello hello.c print.o

hello.o: hello.c
	gcc -c hello.c

print.o: print.c
	gcc -c print.c

clean:
	rm -f hello hello.o print.o

make cleanで不要なファイルを削除する

#ifndefと#endif

機能 :識別子が定義されていないかどうかの判定
書式 :
#ifndef <識別子名>
<処理>
詳細 :<識別子名>が未定義なら<処理>を実行。<処理>が複数行にわたる場合は、処理ブロックの最後を示すために#endifを記述。

#ifndef ARRAY_H // 二重でincludeされることを防ぐ
#define ARRAY_H

複数のソースから array.hがインクルードされていたとしても、 確実に1度だけ array.hの中身を有効にすることができる

array.hをARRAY_Hと書くのはコンベンションか?
特殊な書き方のような印象

[C言語]ヘッダファイルの使い方

### main.c
ヘッダファイルはダブルクオテーションで囲む

#include 
#include "array.h"


int main(){

	int size = 5;
	
	int a[size]; range(a, size, 1, 1);
	int b[size]; range(b, size, 1, -1);
	int c[size]; init(c, size, 0);

	printf("a = ");print(a, size);
	printf("b = ");print(b, size);
	printf("c = ");print(c, size);


	// void init(int *a, int size, int num){
	// 	for(int i = 0; i < size; i++){
	// 		a[i] = num;
	// 	}
	// }

	// for(int i = 0; i < size; i++){
	// 	a[i] = 1 + i * 1;
	// 	b[i] = 1 + i * (-1);
	// }

	// int a[size] = {1, 2, 3, 4, 5};
	// int b[size] = {1, 0, -1, -2, -3};

	for(int i = 0; i < size; i++){
		c[i] = a[i] + b[i];
	}
	printf("\n");
	printf("c = ");print(c, size);

	return 0;
}

array.c

#include 
#include "array.h"

void range(int *a, int size, int start, int step){
		for(int i = 0; i < size; i++){
			a[i] = start + i*step;
		}
	}

void init(int *a, int size, int num){
	for(int i = 0; i < size; i++){
		a[i] = num;
	}
}

void zeros(int *a, int size){
	for(int i = 0; i < size; i++){
		a[i] = 0;
	}
}

void print(int *a, int size){
	printf("[");
	for(int i = 0; i < size; i++){
		printf("%d,", a[i]);
	}
	printf("\b]\n");
}

### ヘッダ
array.h

#ifndef ARRAY_H // 二重でincludeされることを防ぐ
#define ARRAY_H

void range(int *a, int size, int start, int step);
void init(int *a, int size, int num);
void zeros(int *a, int size);
void print(int *a, int size);

#endif

### コンパイル&実行
$ gcc -O2 -o main main.c array.c
$ ./main
a = [1,2,3,4,5]
b = [1,0,-1,-2,-3]
c = [0,0,0,0,0]

c = [2,2,2,2,2]

Raspberry Piと小型カメラと山崎12年

Raspberry Pi3 Model B+と小型カメラを使って画像認識のアプリケーションを作りたい。

Raspberry Pi

ラズパイって思ってたより小さい。
山崎12年50mlと同じ位のサイズ。

取り敢えず以下の手順で開発していくイメージだけど行けるやろうか??
C言語トレーニング -> Raspberry Pi試作 -> Python学習 -> OpenCV学習 -> Django学習 -> 画像認識アプリケーション開発 -> Demo作成

まず、断捨離から始める。

板倉聖宣訳:磁石(および電気)論

ウィリアム・ギルバート原著(コルチェスター出身、ロンドンの医師):doctrina nostra & scientia magnetica

– アリストテレス、テオフラストス、プトレマイオス、ヒッポクラテス、ガレノスには敬意を払うべき
– 書物からの推論を採用せずに、実験をするべきである

### 磁石
magnes lapis(マグネスの石)が鉄の鉱脈の中に発見された
鉄の力強い吸引力が研究された
磁気の南北に向く運動が発見されていた
パラケルススは「天界には磁石の能力を付与された星がある」と断言していた
ナポリ王国の船乗りたちは方位針を使っていた
位置の変化による磁気偏角の違いなどから、特殊の星による影響とする考えを否定した
磁石はその性質の顕著な極[polos]を有する
磁石にも二つの極を持っており、極に近いほど強い力を得る
回転針によって磁極を確認した
磁石は自然な位置関係にあるときは引っ張るが、逆の位置関係にあるときは退ける
N極とS極は互いに誘う
ギリシア人は琥珀のことをエレクトロンと呼んでいた

実験が大事というのはプログラミングにも通じるところがあるように思います。