package at.tugraz.ist.musicdroid;
import java.util.ArrayList;
import java.util.Dictionary;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.Log;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.ScrollView;
public class Tone extends View {
private Resources res = getResources();
private int r;
private int x;
private int c_2_y;
private ArrayList<Integer> y_list = new ArrayList();
private ArrayList<Integer> midiVal = new ArrayList();
private int help_value;
private ArrayList<Boolean> cross = new ArrayList();
private Paint paint_;
private int y_line;
private boolean move_;
public Tone(Context context, ArrayList<Integer> midiVal, int x, int y,
Paint paint, int radius) {
// bekomme y = oberste Notenzeile
super(context);
r = radius;
this.midiVal = midiVal;
this.x = x;
this.c_2_y = y + 4 * r;
this.y_line = y;
calculateCoordinates();
this.paint_ = new Paint(paint);
invalidate();
}
public ArrayList<Integer>getMidiValues(){
return midiVal;
}
private void calculateCoordinates() {
// g2=43 x+r, y-r
for (int i = 0; i < midiVal.size(); i++) {
int octave = midiVal.get(i) / 12 - 4;
int value = midiVal.get(i) % 12; // 0=C
int distance[] = { 6, 6, 5, 5, 4, 3, 3, 2, 2, 1, 1, 0 };
help_value = distance[value];
if (value == 1 || value == 3 || value == 6 || value == 8
|| value == 10) {
if (cross.size() > i)
cross.set(i, true);
else
cross.add(true);
} else {
if (cross.size() > i)
cross.set(i, false);
else
cross.add(false);
}
if (y_list.size() > i)
y_list.set(i, (int) (c_2_y + help_value * r - (octave - 1) * 2
* r * 3.5));
else
y_list.add((int) (c_2_y + help_value * r - (octave - 1) * 2 * r
* 3.5));
}
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < midiVal.size(); i++) {
int y = y_list.get(i);
RectF oval = new RectF(x - r - r / 4, y - r, x + r + r / 4, y + r);
canvas.drawOval(oval, paint_);
if (this.midiVal.get(i) < 72)
canvas.drawLine(x + r + r / 4, y, x + r + r / 4, y - 3 * r,
paint_);
else {
canvas.drawLine(x - r - r / 4, y, x - r - r / 4, y + 3 * r,
paint_);
}
int helpline = y_line + 10 * r;
while (helpline <= y) {
canvas.drawLine(x - 2 * r, helpline, x + 2 * r, helpline,
paint_);
helpline += 2 * r;
}
helpline = y_line - 2 * r;
while (helpline >= y) {
canvas.drawLine(x - r * 2, helpline, x + r * 2, helpline,
paint_);
helpline -= 2 * r;
}
if (cross.get(i)) {
canvas.drawLine(x - 3 * r, y - 2 * r, x - 3 * r, y + 2 * r - 1,
paint_);
canvas.drawLine(x - 2 * r, y - 2 * r, x - 2 * r, y + 2 * r - 1,
paint_);
canvas.drawLine(x - 4 * r, y, x - 3 / 2 * r, y - r, paint_);
canvas.drawLine(x - 4 * r, y + r, x - 3 / 2 * r, y, paint_);
}
}
}
public int get_X() {
return x;
}
public void setX(int new_x) {
x = new_x;
}
public ArrayList<Integer> get_Y() {
return y_list;
}
public void setY(ArrayList<Integer> y_values) {
y_list = y_values;
}
public void setMove() {
move_ = !move_;
if (move_)
paint_.setColor(Color.RED);
else
paint_.setColor(Color.BLACK);
}
public void setColor(String color){
if (color.equals("RED")){
paint_.setColor(Color.RED);
}else if (color.equals("BLACK")){
paint_.setColor(Color.BLACK);
}
}
public boolean isMarked() {
return move_;
}
public void moveMidiVal(boolean up) {
if (move_) {
for (int i = 0; i < midiVal.size(); i++) {
int act_midi = midiVal.get(i);
if (up)
act_midi++;
else
act_midi--;
midiVal.set(i, act_midi);
calculateCoordinates();
}
}
invalidate();
}
}