電気屋に行ってみたら景色違ってた。

スピーカー売り場がない。

誰か安く譲ってくれないかなぁ
プログラムにバグがあった叫び

というか、イントロのハープシコードに騙された

結局、ステレオバージョンには
・別テイクのハープシコード
・別テイクのベース(なんとメインで聴こえるベース)
・別テイクのドラムス
が入っている

これをどう解釈するか!!!
まずは4トラックのトラック割りを考えてみなきゃ

久しぶりに調査を再開した。
自動同期ソフトを作ったらとっても便利チョキ

昔の調査結果を再確認していたら
Fixing a holeで面白い結果が出た。
もともと、リージェントスタジオとアビーロードでレコーディングしていて
記録があやふやな曲である。
記録では第3テイクからモノとステレオを作ったことになっているがそれは間違い。

同期ソフトは、なんと一方のハープシコードを基本に同期した結果を出した。
するとボーカルやギターが同期しない。
これの意味するところは、2台のテープレコーダーを使ってミキシングした、ということ。

ハープシコードが2種類入っているが、一方はリージェントスタジオ、
もう片方はアビーロードのものということになる。

更に調査を進めなきゃ目

手で開けれて、何度でも閉めれる。結構便利。

日本でリサイクルできないのが残念。

炭酸飲料にはぴったりなのに。。。

DirectMusicMIDI演奏させるとき、MIDIデータの中にシステムリセットのデータがあると音が鳴らないドクロ


ビットマップの作成は CreateCompatibleBitmap()でDDBを作ることを推奨されてるけど、64MBのサイズまでしか確保できない。フルカラーだと1000ドット×16000ドットが限界。2chのログを丸ごとコピーすることができない。これに対応するには以下のような関数で、DDBの上限を超えてしまったらDIBを作れば良い。これだとPCに搭載したメモリ一杯まで確保することができる。


HBITMAP MyCreateBitmap( HDC hdc, int width, int height )
{
HBITMAP hBmp = NULL;
if( hdc )
hBmp = CreateCompatibleBitmap(hdc,wiwth,height);

if( hBmp == NULL ) {
BITMAPINFO biBmp;
memset(&biBmp, 0, sizeof(biBmp));
biBmp.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
biBmp.bmiHeader.biBitCount = 32;
biBmp.bmiHeader.biPlanes = 1;
biBmp.bmiHeader.biWidth = width;
biBmp.bmiHeader.biHeight = -height;
DWORD *lpdwPixel;
hBmp = CreateDIBSection(NULL, &biBmp, DIB_RGB_COLORS, (void **)(&lpdwPixel), NULL, 0);
}
return hBmp;
}

意外と簡単かも。

リンクには AudioToolbox と CoreMidi のフレームワークが必要


#include <AudioToolbox/AudioToolbox.h>

void midiplayer(char *fnMid)
{
MusicSequence sequence;
OSStatus err = NewMusicSequence(&sequence);
if( err == noErr ) {
FSRef fsRef;
err = FSPathMakeRef((const UInt8*)fnMid, &fsRef, 0);
err = MusicSequenceLoadSMFWithFlags (sequence, &fsRef, 0);
if( err == noErr ) {
MIDIClientRef theMidiClient;
MIDIClientCreate(CFSTR("Play Sequence"), NULL, NULL, &theMidiClient);
ItemCount destCount = MIDIGetNumberOfDestinations();
if( 0 < destCount ) {
err = MusicSequenceSetMIDIEndpoint (sequence, MIDIGetDestination(0));
}
}
if( err == noErr ) {
MusicPlayer mp;
err = NewMusicPlayer(&mp);
if( err == noErr ) {
err = MusicPlayerSetSequence(mp,sequence);
err = MusicPlayerStart(mp);


// 終わるのを待つ

err = MusicPlayerStop(mp);
err = DisposeMusicPlayer(mp);
}
}
err = DisposeMusicSequence(sequence);
}
}

ソースコード付きの情報が無いので作った分だけ掲載

Visual Studio .NET 2003 のC++でやってみた(CHtmlViewを使ったSDIアプリの例)


void CMainFrame::OnEditCopy()

{
// TODO : ここにコマンド ハンドラ コードを追加します。
long w=800/*希望する幅*/, h=2000/*適当*/;

ChtmlviewView * pView = (ChtmlviewView*)GetActiveView( );
HDC hdc = CreateDC("DISPLAY",0,0,0);
if( hdc ) {
HDC memDC = CreateCompatibleDC (hdc);
if( memDC ) {
IDispatch* pApp = (IDispatch*)pView->GetApplication();
if(pApp){
IHTMLDocument2 *pHtml = (IHTMLDocument2 *)pView->GetHtmlDocument();
IOleObject *p;
pHtml->QueryInterface(IID_IOleObject,(void**)&p);
IHTMLElement *pElement = NULL;
IHTMLElement2 *pElement2 = NULL;
pHtml->get_body(&pElement);
if( pElement ) {
pElement->QueryInterface(IID_IHTMLElement2,(void**)&pElement2);
if( pElement2 )
pElement2->get_scrollHeight(&h);
}
// 幅・高さ(pixel)を0.01mm単位に変換
SIZEL sz, szOrg;
sz.cx = w * 2540 / GetDeviceCaps(memDC,LOGPIXELSX);
sz.cy = h * 2540 / GetDeviceCaps(memDC,LOGPIXELSY);
p->GetExtent(DVASPECT_CONTENT,&szOrg);
p->SetExtent(DVASPECT_CONTENT,&sz);
HBITMAP hHtmlImg = CreateCompatibleBitmap(hdc,w,h);
HBITMAP hBmp = (HBITMAP)SelectObject(memDC, hHtmlImg);

RECT rect;
SetRect(&rect,0,0,w,h);
OleDraw(pApp,DVASPECT_CONTENT,memDC,&rect);
p->SetExtent(DVASPECT_CONTENT,&szOrg);
pApp->Release();

SelectObject(memDC, hBmp);

SaveToFile(hHtmlImg, w, h);
if( OpenClipboard() ) {
EmptyClipboard();
SetClipboardData(CF_BITMAP,hHtmlImg);
CloseClipboard();
}
}

DeleteDC(memDC);
}
DeleteDC(hdc);
}
}