improved timing down to +-300ppm samples per line

- used milliseconds instead of seconds for timing
- did summations in milliseconds till end
- did rounding instead of truncation at critical places
pull/6/head
Ahmet Inan 2015-01-03 00:36:05 +01:00
rodzic 7a7d535165
commit bd7ec1f0bc
3 zmienionych plików z 204 dodań i 132 usunięć

Wyświetl plik

@ -34,14 +34,14 @@ static const int mode_scottieDX = 7;
static const int mode_wrasseSC2_180 = 8;
static const float sync_buildup_seconds = 0.0011f;
static const float robot36_scanline_seconds = 0.15f;
static const float robot72_scanline_seconds = 0.3f;
static const float martin1_scanline_seconds = 0.446446f;
static const float martin2_scanline_seconds = 0.226798f;
static const float scottie1_scanline_seconds = 0.42822f;
static const float scottie2_scanline_seconds = 0.277692f;
static const float scottieDX_scanline_seconds = 1.0503f;
static const float wrasseSC2_180_scanline_seconds = 0.7110225f;
static const float sync_buildup_ms = 1.1f;
static const float robot36_scanline_ms = 150.0f;
static const float robot72_scanline_ms = 300.0f;
static const float martin1_scanline_ms = 446.446f;
static const float martin2_scanline_ms = 226.798f;
static const float scottie1_scanline_ms = 428.22f;
static const float scottie2_scanline_ms = 277.692f;
static const float scottieDX_scanline_ms = 1050.3f;
static const float wrasseSC2_180_scanline_ms = 711.0225f;
#endif

Wyświetl plik

@ -42,16 +42,16 @@ void initialize(float rate, int length, int width, int height)
free_running = 1;
minimum_length = 0.05f * sample_rate;
minimum_sync_length = 0.002f * sample_rate;
sync_buildup_length = sync_buildup_seconds * sample_rate;
sync_buildup_length = round((sync_buildup_ms * sample_rate) / 1000.0f);
robot36_scanline_length = robot36_scanline_seconds * sample_rate;
robot72_scanline_length = robot72_scanline_seconds * sample_rate;
martin1_scanline_length = martin1_scanline_seconds * sample_rate;
martin2_scanline_length = martin2_scanline_seconds * sample_rate;
scottie1_scanline_length = scottie1_scanline_seconds * sample_rate;
scottie2_scanline_length = scottie2_scanline_seconds * sample_rate;
scottieDX_scanline_length = scottieDX_scanline_seconds * sample_rate;
wrasseSC2_180_scanline_length = wrasseSC2_180_scanline_seconds * sample_rate;
robot36_scanline_length = round((robot36_scanline_ms * sample_rate) / 1000.0f);
robot72_scanline_length = round((robot72_scanline_ms * sample_rate) / 1000.0f);
martin1_scanline_length = round((martin1_scanline_ms * sample_rate) / 1000.0f);
martin2_scanline_length = round((martin2_scanline_ms * sample_rate) / 1000.0f);
scottie1_scanline_length = round((scottie1_scanline_ms * sample_rate) / 1000.0f);
scottie2_scanline_length = round((scottie2_scanline_ms * sample_rate) / 1000.0f);
scottieDX_scanline_length = round((scottieDX_scanline_ms * sample_rate) / 1000.0f);
wrasseSC2_180_scanline_length = round((wrasseSC2_180_scanline_ms * sample_rate) / 1000.0f);
const float pairwise_minimum_of_scanline_time_distances = 0.018226f;
float deviation = 0.5f * pairwise_minimum_of_scanline_time_distances * sample_rate;

Wyświetl plik

@ -70,22 +70,31 @@ void robot36_mode()
bitmap_width = 320;
bitmap_height = 240;
const float tolerance = 0.8f;
const float sync_seconds = 0.009f;
const float sync_porch_seconds = 0.003f;
const float sep_porch_seconds = 0.0015f;
const float y_scan_seconds = 0.088f;
const float uv_scan_seconds = 0.044f;
const float seperator_seconds = 0.0045f;
seperator_length = seperator_seconds * sample_rate;
sync_length = tolerance * sync_seconds * sample_rate;
y_begin = sync_porch_seconds * sample_rate;
y_end = y_begin + y_scan_seconds * sample_rate;
u_sep_begin = v_sep_begin = y_end;
u_sep_end = v_sep_end = u_sep_begin + seperator_seconds * sample_rate;
u_begin = v_begin = u_sep_end + sep_porch_seconds * sample_rate;
u_end = v_end = u_begin + uv_scan_seconds * sample_rate;
const float sync_ms = 9.0f;
const float sync_porch_ms = 3.0f;
const float sep_porch_ms = 1.5f;
const float y_scan_ms = 88.0f;
const float uv_scan_ms = 44.0f;
const float seperator_ms = 4.5f;
seperator_length = round((seperator_ms * sample_rate) / 1000.0f);
sync_length = tolerance * (sync_ms * sample_rate) / 1000.0f;
float y_begin_ms = sync_porch_ms;
float y_end_ms = y_begin_ms + y_scan_ms;
float uv_sep_begin_ms = y_end_ms;
float uv_sep_end_ms = uv_sep_begin_ms + seperator_ms;
float uv_begin_ms = uv_sep_end_ms + sep_porch_ms;
float uv_end_ms = uv_begin_ms + uv_scan_ms;
y_begin = round((y_begin_ms * sample_rate) / 1000.0f);
y_end = round((y_end_ms * sample_rate) / 1000.0f);
u_sep_begin = v_sep_begin = round((uv_sep_begin_ms * sample_rate) / 1000.0f);
u_sep_end = v_sep_end = round((uv_sep_end_ms * sample_rate) / 1000.0f);
u_begin = v_begin = round((uv_begin_ms * sample_rate) / 1000.0f);
u_end = v_end = round((uv_end_ms * sample_rate) / 1000.0f);
scanline_length = robot36_scanline_length;
maximum_length = scanline_length + sync_porch_seconds * sample_rate;
maximum_length = scanline_length + (sync_porch_ms * sample_rate) / 1000.0f;
}
void robot72_mode()
{
@ -97,26 +106,39 @@ void robot72_mode()
bitmap_width = 320;
bitmap_height = 240;
const float tolerance = 0.8f;
const float sync_seconds = 0.009f;
const float sync_porch_seconds = 0.003f;
const float sep_porch_seconds = 0.0015f;
const float y_scan_seconds = 0.138f;
const float uv_scan_seconds = 0.069f;
const float seperator_seconds = 0.0045f;
seperator_length = seperator_seconds * sample_rate;
sync_length = tolerance * sync_seconds * sample_rate;
y_begin = sync_porch_seconds * sample_rate;
y_end = y_begin + y_scan_seconds * sample_rate;
v_sep_begin = y_end;
v_sep_end = v_sep_begin + seperator_seconds * sample_rate;
v_begin = v_sep_end + sep_porch_seconds * sample_rate;
v_end = v_begin + uv_scan_seconds * sample_rate;
u_sep_begin = v_end;
u_sep_end = u_sep_begin + seperator_seconds * sample_rate;
u_begin = u_sep_end + sep_porch_seconds * sample_rate;
u_end = u_begin + uv_scan_seconds * sample_rate;
const float sync_ms = 9.0f;
const float sync_porch_ms = 3.0f;
const float sep_porch_ms = 1.5f;
const float y_scan_ms = 138.0f;
const float uv_scan_ms = 69.0f;
const float seperator_ms = 4.5f;
seperator_length = round((seperator_ms * sample_rate) / 1000.0f);
sync_length = tolerance * (sync_ms * sample_rate) / 1000.0f;
float y_begin_ms = sync_porch_ms;
float y_end_ms = y_begin_ms + y_scan_ms;
float v_sep_begin_ms = y_end_ms;
float v_sep_end_ms = v_sep_begin_ms + seperator_ms;
float v_begin_ms = v_sep_end_ms + sep_porch_ms;
float v_end_ms = v_begin_ms + uv_scan_ms;
float u_sep_begin_ms = v_end_ms;
float u_sep_end_ms = u_sep_begin_ms + seperator_ms;
float u_begin_ms = u_sep_end_ms + sep_porch_ms;
float u_end_ms = u_begin_ms + uv_scan_ms;
y_begin = round((y_begin_ms * sample_rate) / 1000.0f);
y_end = round((y_end_ms * sample_rate) / 1000.0f);
v_sep_begin = round((v_sep_begin_ms * sample_rate) / 1000.0f);
v_sep_end = round((v_sep_end_ms * sample_rate) / 1000.0f);
v_begin = round((v_begin_ms * sample_rate) / 1000.0f);
v_end = round((v_end_ms * sample_rate) / 1000.0f);
u_sep_begin = round((u_sep_begin_ms * sample_rate) / 1000.0f);
u_sep_end = round((u_sep_end_ms * sample_rate) / 1000.0f);
u_begin = round((u_begin_ms * sample_rate) / 1000.0f);
u_end = round((u_end_ms * sample_rate) / 1000.0f);
scanline_length = robot72_scanline_length;
maximum_length = scanline_length + sync_porch_seconds * sample_rate;
maximum_length = scanline_length + (sync_porch_ms * sample_rate) / 1000.0f;
}
void martin1_mode()
{
@ -128,22 +150,29 @@ void martin1_mode()
bitmap_width = 320;
bitmap_height = 256;
const float tolerance = 0.5f;
const float sync_seconds = 0.004862f;
const float sync_porch_seconds = 0.000572f;
const float r_scan_seconds = 0.146432f;
const float g_scan_seconds = 0.146432f;
const float b_scan_seconds = 0.146432f;
const float seperator_seconds = 0.000572f;
seperator_length = seperator_seconds * sample_rate;
sync_length = tolerance * sync_seconds * sample_rate;
g_begin = sync_porch_seconds * sample_rate;
g_end = g_begin + g_scan_seconds * sample_rate;
b_begin = g_end + seperator_seconds * sample_rate;
b_end = b_begin + b_scan_seconds * sample_rate;
r_begin = b_end + seperator_seconds * sample_rate;
r_end = r_begin + r_scan_seconds * sample_rate;
const float sync_ms = 4.862f;
const float sync_porch_ms = 0.572f;
const float rgb_scan_ms = 146.432f;
const float seperator_ms = 0.572f;
seperator_length = round((seperator_ms * sample_rate) / 1000.0f);
sync_length = tolerance * (sync_ms * sample_rate) / 1000.0f;
float g_begin_ms = sync_porch_ms;
float g_end_ms = g_begin_ms + rgb_scan_ms;
float b_begin_ms = g_end_ms + seperator_ms;
float b_end_ms = b_begin_ms + rgb_scan_ms;
float r_begin_ms = b_end_ms + seperator_ms;
float r_end_ms = r_begin_ms + rgb_scan_ms;
r_begin = round((r_begin_ms * sample_rate) / 1000.0f);
r_end = round((r_end_ms * sample_rate) / 1000.0f);
g_end = round((g_end_ms * sample_rate) / 1000.0f);
g_begin = round((g_begin_ms * sample_rate) / 1000.0f);
b_end = round((b_end_ms * sample_rate) / 1000.0f);
b_begin = round((b_begin_ms * sample_rate) / 1000.0f);
scanline_length = martin1_scanline_length;
maximum_length = scanline_length + sync_porch_seconds * sample_rate;
maximum_length = scanline_length + (sync_porch_ms * sample_rate) / 1000.0f;
}
void martin2_mode()
{
@ -155,22 +184,29 @@ void martin2_mode()
bitmap_width = 320;
bitmap_height = 256;
const float tolerance = 0.5f;
const float sync_seconds = 0.004862f;
const float sync_porch_seconds = 0.000572f;
const float r_scan_seconds = 0.073216f;
const float g_scan_seconds = 0.073216f;
const float b_scan_seconds = 0.073216f;
const float seperator_seconds = 0.000572f;
seperator_length = seperator_seconds * sample_rate;
sync_length = tolerance * sync_seconds * sample_rate;
g_begin = sync_porch_seconds * sample_rate;
g_end = g_begin + g_scan_seconds * sample_rate;
b_begin = g_end + seperator_seconds * sample_rate;
b_end = b_begin + b_scan_seconds * sample_rate;
r_begin = b_end + seperator_seconds * sample_rate;
r_end = r_begin + r_scan_seconds * sample_rate;
const float sync_ms = 4.862f;
const float sync_porch_ms = 0.572f;
const float rgb_scan_ms = 73.216f;
const float seperator_ms = 0.572f;
seperator_length = round((seperator_ms * sample_rate) / 1000.0f);
sync_length = tolerance * (sync_ms * sample_rate) / 1000.0f;
float g_begin_ms = sync_porch_ms;
float g_end_ms = g_begin_ms + rgb_scan_ms;
float b_begin_ms = g_end_ms + seperator_ms;
float b_end_ms = b_begin_ms + rgb_scan_ms;
float r_begin_ms = b_end_ms + seperator_ms;
float r_end_ms = r_begin_ms + rgb_scan_ms;
r_begin = round((r_begin_ms * sample_rate) / 1000.0f);
r_end = round((r_end_ms * sample_rate) / 1000.0f);
g_end = round((g_end_ms * sample_rate) / 1000.0f);
g_begin = round((g_begin_ms * sample_rate) / 1000.0f);
b_end = round((b_end_ms * sample_rate) / 1000.0f);
b_begin = round((b_begin_ms * sample_rate) / 1000.0f);
scanline_length = martin2_scanline_length;
maximum_length = scanline_length + sync_porch_seconds * sample_rate;
maximum_length = scanline_length + (sync_porch_ms * sample_rate) / 1000.0f;
}
void scottie1_mode()
{
@ -182,20 +218,29 @@ void scottie1_mode()
bitmap_width = 320;
bitmap_height = 256;
const float tolerance = 0.8f;
const float sync_seconds = 0.009f;
const float sync_porch_seconds = 0.0015f;
const float rgb_scan_seconds = 0.138240f;
const float seperator_seconds = 0.0015f;
seperator_length = seperator_seconds * sample_rate;
sync_length = tolerance * sync_seconds * sample_rate;
r_begin = sync_porch_seconds * sample_rate;
r_end = r_begin + rgb_scan_seconds * sample_rate;
b_end = - sync_seconds * sample_rate;
b_begin = b_end - rgb_scan_seconds * sample_rate;
g_end = b_begin - seperator_seconds * sample_rate;
g_begin = g_end - rgb_scan_seconds * sample_rate;
const float sync_ms = 9.0f;
const float sync_porch_ms = 1.5f;
const float rgb_scan_ms = 138.240f;
const float seperator_ms = 1.5f;
seperator_length = round((seperator_ms * sample_rate) / 1000.0f);
sync_length = tolerance * (sync_ms * sample_rate) / 1000.0f;
float r_begin_ms = sync_porch_ms;
float r_end_ms = r_begin_ms + rgb_scan_ms;
float b_end_ms = - sync_ms;
float b_begin_ms = b_end_ms - rgb_scan_ms;
float g_end_ms = b_begin_ms - seperator_ms;
float g_begin_ms = g_end_ms - rgb_scan_ms;
r_begin = round((r_begin_ms * sample_rate) / 1000.0f);
r_end = round((r_end_ms * sample_rate) / 1000.0f);
g_end = round((g_end_ms * sample_rate) / 1000.0f);
g_begin = round((g_begin_ms * sample_rate) / 1000.0f);
b_end = round((b_end_ms * sample_rate) / 1000.0f);
b_begin = round((b_begin_ms * sample_rate) / 1000.0f);
scanline_length = scottie1_scanline_length;
maximum_length = scanline_length + sync_porch_seconds * sample_rate;
maximum_length = scanline_length + (sync_porch_ms * sample_rate) / 1000.0f;
}
void scottie2_mode()
{
@ -207,20 +252,29 @@ void scottie2_mode()
bitmap_width = 320;
bitmap_height = 256;
const float tolerance = 0.8f;
const float sync_seconds = 0.009f;
const float sync_porch_seconds = 0.0015f;
const float rgb_scan_seconds = 0.088064f;
const float seperator_seconds = 0.0015f;
seperator_length = seperator_seconds * sample_rate;
sync_length = tolerance * sync_seconds * sample_rate;
r_begin = sync_porch_seconds * sample_rate;
r_end = r_begin + rgb_scan_seconds * sample_rate;
b_end = - sync_seconds * sample_rate;
b_begin = b_end - rgb_scan_seconds * sample_rate;
g_end = b_begin - seperator_seconds * sample_rate;
g_begin = g_end - rgb_scan_seconds * sample_rate;
const float sync_ms = 9.0f;
const float sync_porch_ms = 1.5f;
const float rgb_scan_ms = 88.064f;
const float seperator_ms = 1.5f;
seperator_length = round((seperator_ms * sample_rate) / 1000.0f);
sync_length = tolerance * (sync_ms * sample_rate) / 1000.0f;
float r_begin_ms = sync_porch_ms;
float r_end_ms = r_begin_ms + rgb_scan_ms;
float b_end_ms = - sync_ms;
float b_begin_ms = b_end_ms - rgb_scan_ms;
float g_end_ms = b_begin_ms - seperator_ms;
float g_begin_ms = g_end_ms - rgb_scan_ms;
r_begin = round((r_begin_ms * sample_rate) / 1000.0f);
r_end = round((r_end_ms * sample_rate) / 1000.0f);
g_end = round((g_end_ms * sample_rate) / 1000.0f);
g_begin = round((g_begin_ms * sample_rate) / 1000.0f);
b_end = round((b_end_ms * sample_rate) / 1000.0f);
b_begin = round((b_begin_ms * sample_rate) / 1000.0f);
scanline_length = scottie2_scanline_length;
maximum_length = scanline_length + sync_porch_seconds * sample_rate;
maximum_length = scanline_length + (sync_porch_ms * sample_rate) / 1000.0f;
}
void scottieDX_mode()
{
@ -232,20 +286,29 @@ void scottieDX_mode()
bitmap_width = 320;
bitmap_height = 256;
const float tolerance = 0.8f;
const float sync_seconds = 0.009f;
const float sync_porch_seconds = 0.0015f;
const float rgb_scan_seconds = 0.3456f;
const float seperator_seconds = 0.0015f;
seperator_length = seperator_seconds * sample_rate;
sync_length = tolerance * sync_seconds * sample_rate;
r_begin = sync_porch_seconds * sample_rate;
r_end = r_begin + rgb_scan_seconds * sample_rate;
b_end = - sync_seconds * sample_rate;
b_begin = b_end - rgb_scan_seconds * sample_rate;
g_end = b_begin - seperator_seconds * sample_rate;
g_begin = g_end - rgb_scan_seconds * sample_rate;
const float sync_ms = 9.0f;
const float sync_porch_ms = 1.5f;
const float rgb_scan_ms = 345.6f;
const float seperator_ms = 1.5f;
seperator_length = round((seperator_ms * sample_rate) / 1000.0f);
sync_length = tolerance * (sync_ms * sample_rate) / 1000.0f;
float r_begin_ms = sync_porch_ms;
float r_end_ms = r_begin_ms + rgb_scan_ms;
float b_end_ms = - sync_ms;
float b_begin_ms = b_end_ms - rgb_scan_ms;
float g_end_ms = b_begin_ms - seperator_ms;
float g_begin_ms = g_end_ms - rgb_scan_ms;
r_begin = round((r_begin_ms * sample_rate) / 1000.0f);
r_end = round((r_end_ms * sample_rate) / 1000.0f);
g_end = round((g_end_ms * sample_rate) / 1000.0f);
g_begin = round((g_begin_ms * sample_rate) / 1000.0f);
b_end = round((b_end_ms * sample_rate) / 1000.0f);
b_begin = round((b_begin_ms * sample_rate) / 1000.0f);
scanline_length = scottieDX_scanline_length;
maximum_length = scanline_length + sync_porch_seconds * sample_rate;
maximum_length = scanline_length + (sync_porch_ms * sample_rate) / 1000.0f;
}
void wrasseSC2_180_mode()
{
@ -257,18 +320,27 @@ void wrasseSC2_180_mode()
bitmap_width = 320;
bitmap_height = 256;
const float tolerance = 0.5f;
const float sync_seconds = 0.0055225f;
const float sync_porch_seconds = 0.0005f;
const float rgb_scan_seconds = 0.235f;
sync_length = tolerance * sync_seconds * sample_rate;
r_begin = sync_porch_seconds * sample_rate;
r_end = r_begin + rgb_scan_seconds * sample_rate;
g_begin = r_end;
g_end = g_begin + rgb_scan_seconds * sample_rate;
b_begin = g_end;
b_end = b_begin + rgb_scan_seconds * sample_rate;
const float sync_ms = 5.5225f;
const float sync_porch_ms = 0.5f;
const float rgb_scan_ms = 235.0f;
sync_length = tolerance * (sync_ms * sample_rate) / 1000.0f;
float r_begin_ms = sync_porch_ms;
float r_end_ms = r_begin_ms + rgb_scan_ms;
float g_begin_ms = r_end_ms;
float g_end_ms = g_begin_ms + rgb_scan_ms;
float b_begin_ms = g_end_ms;
float b_end_ms = b_begin_ms + rgb_scan_ms;
r_begin = round((r_begin_ms * sample_rate) / 1000.0f);
r_end = round((r_end_ms * sample_rate) / 1000.0f);
g_end = round((g_end_ms * sample_rate) / 1000.0f);
g_begin = round((g_begin_ms * sample_rate) / 1000.0f);
b_end = round((b_end_ms * sample_rate) / 1000.0f);
b_begin = round((b_begin_ms * sample_rate) / 1000.0f);
scanline_length = wrasseSC2_180_scanline_length;
maximum_length = scanline_length + sync_porch_seconds * sample_rate;
maximum_length = scanline_length + (sync_porch_ms * sample_rate) / 1000.0f;
}
static void switch_mode(int new_mode)