約 2,512,746 件
https://w.atwiki.jp/sampleisbest/pages/592.html
開発環境 Microsoft Visual Studio Community 2019 実行環境 Microsoft Windows 10 Home (64bit) プロジェクト テンプレート C++ 空のプロジェクト プロジェクト名 dx11domino dx11domino.cpp #pragma comment(lib, "d3d11") #pragma comment(lib, "d3dcompiler") #include Windows.h #include wrl.h #include d3d11.h #include d3dcompiler.h #include DirectXMath.h #define HLSL_FILE L"dx11domino.fx" #define NUM 500 #define STEP 4 #define CYCLE (NUM * STEP) using namespace Microsoft WRL; using namespace DirectX; struct ConstantBuffer { XMMATRIX mView; XMMATRIX mProjection; float frame; float cycle; float f2, f3;// filler }; struct InstanceBuffer { XMFLOAT4 domino; }; struct Head { float x, y, z; float dir; float delta; }; // 外部変数 ComPtr ID3D11Device g_pDevice; ComPtr ID3D11DeviceContext g_pContext; ComPtr IDXGISwapChain g_pSwapChain; ComPtr ID3D11RenderTargetView g_pRenderTargetView; ComPtr ID3D11VertexShader g_pVertexShader; ComPtr ID3D11PixelShader g_pPixelShader; ComPtr ID3D11InputLayout g_pInstanceLayout; ComPtr ID3D11Buffer g_pInstanceBuffer; ComPtr ID3D11Buffer g_pConstantBuffer; ComPtr ID3D11Texture2D g_pDepthBuffer; ComPtr ID3D11DepthStencilView g_pDepthView; InstanceBuffer g_ib[NUM]; XMFLOAT4 g_rail[CYCLE]; Head g_head; XMFLOAT3 g_cam = { 0, 20, 0 }; int g_frame = 0; // 関数宣言 HWND InitWindow(HINSTANCE hInst); HRESULT InitDevice(HWND hWnd); void CleanupDevice(); LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void Render(); void CreateRail(); int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR, int nCmdShow) { HWND hWnd = InitWindow(hInstance); if (!hWnd) return -1; if (FAILED(InitDevice(hWnd))) { CleanupDevice(); return -1; } for (int i = 0; i CYCLE; i++) { CreateRail(); } ShowWindow(hWnd, nCmdShow); MSG msg = { 0 }; while (msg.message != WM_QUIT) { if (PeekMessage( msg, nullptr, 0, 0, PM_REMOVE)) { TranslateMessage( msg); DispatchMessage( msg); } else { Render(); } } CleanupDevice(); return int(msg.wParam); } HWND InitWindow(HINSTANCE hInst) { WNDCLASSEX wc = { sizeof WNDCLASSEX }; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.hInstance = hInst; wc.hCursor = LoadCursor(nullptr, IDC_ARROW); wc.hbrBackground = HBRUSH(COLOR_WINDOW + 1); wc.lpszClassName = L"dx11domino"; if (!RegisterClassEx( wc)) return nullptr; DWORD dwStyle = WS_OVERLAPPEDWINDOW; RECT rc = { 0, 0, 640, 400 }; AdjustWindowRect( rc, dwStyle, FALSE); HWND hWnd = CreateWindow( wc.lpszClassName, L"dx11domino", dwStyle, CW_USEDEFAULT, 0, rc.right - rc.left, rc.bottom - rc.top, nullptr, nullptr, hInst, nullptr); return hWnd; } HRESULT CompileShaderFromFile( LPCWSTR szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3DBlob** ppBlobOut) { DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS; ComPtr ID3DBlob pErrorBlob; HRESULT hr = D3DCompileFromFile(szFileName, nullptr, nullptr, szEntryPoint, szShaderModel, dwShaderFlags, 0, ppBlobOut, pErrorBlob); if (FAILED(hr)) { if (pErrorBlob) { OutputDebugStringA((LPCSTR)pErrorBlob- GetBufferPointer()); } return hr; } return S_OK; } HRESULT InitDevice(HWND hWnd) { HRESULT hr; RECT rc; GetClientRect(hWnd, rc); UINT width = rc.right - rc.left; UINT height = rc.bottom - rc.top; DXGI_SWAP_CHAIN_DESC sd = { 0 }; sd.BufferDesc.Width = width; sd.BufferDesc.Height = height; sd.BufferDesc.RefreshRate.Numerator = 60; sd.BufferDesc.RefreshRate.Denominator = 1; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;// 符号なし正規化整数 sd.SampleDesc.Count = 1; sd.SampleDesc.Quality = 0; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.BufferCount = 1; sd.OutputWindow = hWnd; sd.Windowed = TRUE; sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; D3D_FEATURE_LEVEL featureLevel; hr = D3D11CreateDeviceAndSwapChain( nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, sd, g_pSwapChain, g_pDevice, featureLevel, g_pContext); if (FAILED(hr)) return hr; // レンダーターゲットビュー ComPtr ID3D11Texture2D pBackBuffer; hr = g_pSwapChain- GetBuffer(0, IID_PPV_ARGS( pBackBuffer)); if (FAILED(hr)) return hr; hr = g_pDevice- CreateRenderTargetView( pBackBuffer.Get(), nullptr, g_pRenderTargetView); if (FAILED(hr)) return hr; // 深度バッファ D3D11_TEXTURE2D_DESC td = { 0 }; td.Width = width; td.Height = height; td.MipLevels = 1; td.ArraySize = 1; td.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; td.SampleDesc.Count = 1; td.SampleDesc.Quality = 0; td.Usage = D3D11_USAGE_DEFAULT; td.BindFlags = D3D11_BIND_DEPTH_STENCIL; hr = g_pDevice- CreateTexture2D( td, nullptr, g_pDepthBuffer); if (FAILED(hr)) return hr; // 深度ビュー D3D11_DEPTH_STENCIL_VIEW_DESC dsv = { td.Format, D3D11_DSV_DIMENSION_TEXTURE2D }; g_pDevice- CreateDepthStencilView(g_pDepthBuffer.Get(), dsv, g_pDepthView); if (FAILED(hr)) return hr; // ビューポート D3D11_VIEWPORT vp = { 0 }; vp.Width = (FLOAT)width; vp.Height = (FLOAT)height; vp.MinDepth = 0; vp.MaxDepth = 1; g_pContext- RSSetViewports(1, vp); // 頂点シェーダ ComPtr ID3DBlob pVSBlob; hr = CompileShaderFromFile(HLSL_FILE, "VS", "vs_5_0", pVSBlob); if (FAILED(hr)) { return hr; } hr = g_pDevice- CreateVertexShader( pVSBlob- GetBufferPointer(), pVSBlob- GetBufferSize(), nullptr, g_pVertexShader); if (FAILED(hr)) return hr; // ピクセルシェーダ ComPtr ID3DBlob pPSBlob; hr = CompileShaderFromFile(HLSL_FILE, "PS", "ps_5_0", pPSBlob); if (FAILED(hr)) { return hr; } hr = g_pDevice- CreatePixelShader( pPSBlob- GetBufferPointer(), pPSBlob- GetBufferSize(), nullptr, g_pPixelShader); if (FAILED(hr)) return hr; // 入力レイアウト D3D11_INPUT_ELEMENT_DESC layout[] = { { "TEXCOORD", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, }; hr = g_pDevice- CreateInputLayout(layout, ARRAYSIZE(layout), pVSBlob- GetBufferPointer(), pVSBlob- GetBufferSize(), g_pInstanceLayout); if (FAILED(hr)) return hr; g_pContext- IASetInputLayout(g_pInstanceLayout.Get()); // インスタンスバッファ D3D11_BUFFER_DESC ib = { 0 }; ib.ByteWidth = (sizeof InstanceBuffer) * NUM; ib.Usage = D3D11_USAGE_DEFAULT; ib.BindFlags = D3D11_BIND_VERTEX_BUFFER; hr = g_pDevice- CreateBuffer( ib, nullptr, g_pInstanceBuffer); if (FAILED(hr)) return hr; UINT stride = sizeof InstanceBuffer; UINT offset = 0; g_pContext- IASetVertexBuffers( 0, 1, g_pInstanceBuffer.GetAddressOf(), stride, offset); // 定数バッファ D3D11_BUFFER_DESC cb = { 0 }; cb.ByteWidth = sizeof ConstantBuffer; cb.Usage = D3D11_USAGE_DEFAULT; cb.BindFlags = D3D11_BIND_CONSTANT_BUFFER; hr = g_pDevice- CreateBuffer( cb, nullptr, g_pConstantBuffer); if (FAILED(hr)) return hr; // g_pContext- VSSetShader(g_pVertexShader.Get(), nullptr, 0); g_pContext- VSSetConstantBuffers(0, 1, g_pConstantBuffer.GetAddressOf()); g_pContext- PSSetShader(g_pPixelShader.Get(), nullptr, 0); return S_OK; } void CleanupDevice() { if (g_pContext) { g_pContext- ClearState(); } } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; switch (uMsg) { case WM_PAINT hdc = BeginPaint(hWnd, ps); EndPaint(hWnd, ps); break; case WM_DESTROY PostQuitMessage(0); break; default return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; } void Render() { XMFLOAT4 target = g_rail[(g_frame + CYCLE / 2) % CYCLE]; float dx = g_cam.x - target.x; float dz = g_cam.z - target.z; float dist1 = sqrtf(dx * dx + dz * dz); float dist2 = fminf(fmaxf(dist1, 20), 100); if (dist1 != dist2) { float rad = atan2f(dx, dz); g_cam.x = target.x + sinf(rad) * dist2; g_cam.z = target.z + cosf(rad) * dist2; } // g_pContext- OMSetRenderTargets( 1, g_pRenderTargetView.GetAddressOf(), g_pDepthView.Get()); float ClearColor[4] = { 0, 0, 0, 1 }; g_pContext- ClearRenderTargetView(g_pRenderTargetView.Get(), ClearColor); g_pContext- ClearDepthStencilView(g_pDepthView.Get(), D3D11_CLEAR_DEPTH, 1, 0); XMFLOAT3 up(0, 1, 0); ConstantBuffer cb; cb.mView = XMMatrixLookAtLH( XMLoadFloat3( g_cam), XMLoadFloat4( target), XMLoadFloat3( up)); cb.mProjection = XMMatrixPerspectiveFovLH( XMConvertToRadians(15), 640.0f / 400.0f, 1, 500); cb.frame = float(g_frame); cb.cycle = CYCLE; g_pContext- UpdateSubresource(g_pConstantBuffer.Get(), 0, nullptr, cb, 0, 0); g_pContext- UpdateSubresource(g_pInstanceBuffer.Get(), 0, nullptr, g_ib, 0, 0); g_pContext- IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); g_pContext- DrawInstanced(18, NUM, 0, 0); g_pSwapChain- Present(1, 0); // CreateRail(); } void CreateRail() { if (g_frame % 32 == 0) { g_head.delta = float(rand() % 4 - 1); } float dist = 0.75; float rad = XMConvertToRadians(g_head.dir); float s, c; XMScalarSinCos( s, c, rad); g_head.x += s * dist; g_head.z += c * dist; g_head.dir += g_head.delta; int f = g_frame % CYCLE; g_rail[f] = { g_head.x, 0, g_head.z, rad }; if (g_frame % STEP == 0) { int id = f / STEP; g_ib[id].domino = g_rail[f]; } g_frame++; } dx11domino.fx cbuffer ConstantBuffer register(b0) { matrix View; matrix Projection; float frame; float cycle; }; struct VS_INPUT { float4 domino TEXCOORD; uint vid SV_VertexID; uint iid SV_InstanceID; }; struct PS_INPUT { float4 Pos SV_Position; float4 Coord TEXCOORD; }; matrix rotationX(float angle) { float c = cos(angle); float s = sin(angle); return matrix( 1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1); } matrix rotationY(float angle) { float c = cos(angle); float s = sin(angle); return matrix( c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1); } matrix translation(float3 t) { return matrix( 1, 0, 0, t.x, 0, 1, 0, t.y, 0, 0, 1, t.z, 0, 0, 0, 1); } static uint vertices[] = { 3,1,2,0, 0,4,2,6,3,7,1,5,0,4, 4,5,6,7 }; // Vertex Shader PS_INPUT VS(VS_INPUT input) { PS_INPUT output = (PS_INPUT)0; uint vtx = vertices[input.vid]; float3 coord = float3(vtx 1, (vtx 1) 1, (vtx 2) 1); float3 pos = (coord - 0.5) * float3(2, 4, 1); float iframe = floor(frame / cycle) * cycle + float(input.iid) * 4.0; if (iframe frame) { iframe += cycle; } float f = iframe - frame; float a = clamp((cycle / 2.0 - f) * 7.5, 0.0, 70.0); matrix world = mul(rotationY(input.domino.w), rotationX(radians(a))); world = mul(translation(input.domino.xyz), world); matrix mvp = mul(mul(Projection, View), world); output.Pos = mul(mvp, float4(pos, 1)); output.Coord = float4(coord, 1); return output; } // Pixel Shader float4 PS(PS_INPUT input) SV_Target { float3 edge = step(0.48, abs(input.Coord.xyz - 0.5)); if (length(edge) 1.0) { return float4(0.5, 0.5, 0.5, 1); } return input.Coord; }
https://w.atwiki.jp/sampleisbest/pages/307.html
開発環境 Microsoft Office Excel 2007 (SP3) 実行環境 Microsoft Windows 7 Home Premium (32bit) 手順 下にあるSheet1.csvファイルを用意しExcelで開く(Sheet1というワークシートに取り込まれるはず) ワークシートSheet2を作る Alt+F11でVisual Basic Editorを起動する メニューから[挿入]-[標準モジュール]を選択しModule1をコピペする Excelマクロ有効ブック(*.xlsm)で保存する(例:xls2smf.xlsm) Mainプロシージャ内にカーソルを合わせてF5キーを押す Module1 Const colmax = 33 Const path_out = "sample.mid" ライブラリ/ドキュメント Const timebase = 480 Dim datalen As Long データ長 Dim fileno As Integer ファイル番号 Sub Main() scalelist = Array(0, 2, 4, 5, 7, 9, 11) Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") ws2.Cells.Clear r2 = 1 For Row = 1 To 12 notelen = 0 For col = 1 To colmax output = False c = ws1.Cells(Row, col) c1 = Left(c, 1) If c1 "" Then If notelen = 0 Then startc = c1 startcol = col End If notelen = notelen + 1 If Right(c, 1) = ";" Then output = True End If Else output = True End If If output Then If notelen 0 Then starttick = (timebase * 4) * (startcol - 1) \ 8 notetick = (timebase * 4) * notelen \ 8 r = 12 - Row notenum = (r \ 7 + 5) * 12 + scalelist(r Mod 7) If startc = "#" Then notenum = notenum + 1 ws2.Cells(r2, 1) = starttick ws2.Cells(r2, 2) = H90 ws2.Cells(r2, 3) = notenum ws2.Cells(r2, 4) = H70 r2 = r2 + 1 ws2.Cells(r2, 1) = starttick + notetick * 7 \ 8 ws2.Cells(r2, 2) = H80 ws2.Cells(r2, 3) = notenum ws2.Cells(r2, 4) = H0 r2 = r2 + 1 notelen = 0 End If End If Next Next ws2.UsedRange.Sort key1 =ws2.Columns(1) トラック終了 ws2.Cells(r2, 1) = CLng(timebase * 4) * colmax \ 8 ws2.Cells(r2, 2) = HFF ws2.Cells(r2, 3) = H2F ws2.Cells(r2, 4) = H0 ファイル出力 fileno = FreeFile If Dir(path_out) "" Then Kill path_out End If Open path_out For Binary Access Write As #fileno ヘッダチャンク PutBE 4, H4D546864 MThd PutBE 4, 6 データ長 PutBE 2, 0 フォーマットタイプ PutBE 2, 1 トラック数 PutBE 2, timebase タイムベース トラックチャンク PutBE 4, H4D54726B MTrk PutBE 4, 0 データ長(仮) datalen = 0 Dim prevtick As Long prevtick = 0 For Row = 1 To r2 可変長tick Dim tick, t As Long tick = ws2.Cells(Row, 1) t = tick - prevtick t = ((t And HFE00000) * 8) Or ((t And H1FC000) * 4) Or ((t And H3F80) * 2) Or (t And H7F) For c = 3 To 0 Step -1 Dim b As Long b = t \ (2 ^ (8 * c)) And HFF If 0 c Then b = b Or H80 If b H80 Then Put #fileno, , CByte(b) datalen = datalen + 1 End If Next For col = 2 To 4 Put #fileno, , CByte(ws2.Cells(Row, col)) Next datalen = datalen + 3 prevtick = tick Next データ長 For c = 0 To 3 Put #fileno, 19 + c, CByte(datalen \ (2 ^ (8 * (3 - c))) And HFF) Next Close #fileno 再生 CreateObject("Wscript.Shell").Run path_out End Sub Sub PutBE(count, value As Long) For c = count - 1 To 0 Step -1 Put #fileno, , CByte(value \ (2 ^ (8 * c)) And HFF) Next End Sub Sheet1.csv ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,#,,#,,,,,,#,,#,,,,,,#,#,,,#,#,,,o,,o ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, #,,,,,,,,#,,,,,,,,#,,,,,,,,,,,,,, ,#,,,,,,,,#,,,,,,,,#,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,o,,o ,,,,#,,#,,,,,,#,,#,,,,,,#,#,,,#,#,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,#,#,,,,,,,#,#,,,,,,,#,#,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,#,#,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,#,#,,,
https://w.atwiki.jp/sampleisbest/pages/179.html
開発環境 Microsoft Visual C# 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Windows Game (4.0) プロジェクト名 XnaShader ColorMap.pngは下記サイトからダウンロードする。 参考 プログラマブル・シェーダによる積極的なGPUの活用 - @IT Program_3.cs // #3 using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; class Game1 Game { GraphicsDeviceManager graphics; VertexBuffer vb; Effect effect; RenderTarget2D renderTarget; bool updateCachedTexture = true; Vector2 offset = new Vector2(-0.25f, 0.0f); float zoom = 3.0f; // 頂点構造体 struct MyVertex IVertexType { Vector2 Position; Vector2 UV; public MyVertex(Vector2 position, Vector2 uv) { Position = position; UV = uv; } public readonly static VertexDeclaration VertexDeclaration = new VertexDeclaration( new VertexElement[] { new VertexElement(0, VertexElementFormat.Vector2, VertexElementUsage.Position, 0), new VertexElement(8, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 0), }); VertexDeclaration IVertexType.VertexDeclaration { get { return VertexDeclaration;} } } public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; graphics.PreferredBackBufferWidth = 800; graphics.PreferredBackBufferHeight = 600; Window.AllowUserResizing = true; } protected override void LoadContent() { const int numVertices = 4; vb = new VertexBuffer(GraphicsDevice, typeof(MyVertex), numVertices, BufferUsage.None); MyVertex[] vertices = new MyVertex[numVertices] { new MyVertex(new Vector2(-1.0f, 1.0f), new Vector2(0.0f, 1.0f)), // LT new MyVertex(new Vector2( 1.0f, 1.0f), new Vector2(1.0f, 1.0f)), // RT new MyVertex(new Vector2(-1.0f, -1.0f), new Vector2(0.0f, 0.0f)), // LB new MyVertex(new Vector2( 1.0f, -1.0f), new Vector2(1.0f, 0.0f)), // RB }; vb.SetData(vertices); // ContentにMandelbrot.fxを追加しておく effect = Content.Load Effect ("Mandelbrot"); // ContentにColorMap.pngを追加しておく effect.Parameters["colorMapTexture"].SetValue(Content.Load Texture2D ("ColorMap")); if (renderTarget == null) { renderTarget = new RenderTarget2D( GraphicsDevice, GraphicsDevice.PresentationParameters.BackBufferWidth, GraphicsDevice.PresentationParameters.BackBufferHeight); updateCachedTexture = true; } base.LoadContent(); } protected override void UnloadContent() { if (renderTarget != null) { renderTarget.Dispose(); renderTarget = null; } base.UnloadContent(); } protected override void Update(GameTime gameTime) { float oldZoom = zoom; Vector2 oldOffset = offset; // 移動量 float offsetMove = 0.01f * (float)Math.Log(zoom + 1.0f); KeyboardState key = Keyboard.GetState(); if (key.IsKeyDown(Keys.Left)) { offset.X -= offsetMove; } if (key.IsKeyDown(Keys.Right)) { offset.X += offsetMove; } if (key.IsKeyDown(Keys.Down)) { offset.Y -= offsetMove; } if (key.IsKeyDown(Keys.Up)) { offset.Y += offsetMove; } if (key.IsKeyDown(Keys.PageDown)) { zoom *= 1.05f; } if (key.IsKeyDown(Keys.PageUp)) { zoom /= 1.05f; } if (key.IsKeyDown(Keys.Escape)) { Exit(); } updateCachedTexture |= (oldZoom != zoom || oldOffset != offset); base.Update(gameTime); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); // 再描画が必要なときだけテクスチャ・レンダリングを行う if (updateCachedTexture) { //エフェクトのパラメータ更新 effect.Parameters["Zoom"].SetValue(zoom); effect.Parameters["Aspect"].SetValue(GraphicsDevice.Viewport.AspectRatio); effect.Parameters["Offset"].SetValue(offset); RenderTargetBinding[] rtb = GraphicsDevice.GetRenderTargets(); GraphicsDevice.SetRenderTarget(renderTarget); // エフェクト描画 effect.CurrentTechnique = effect.Techniques["Mandelbrot"]; GraphicsDevice.SetVertexBuffer(vb); foreach (EffectPass pass in effect.CurrentTechnique.Passes) { pass.Apply(); GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); } GraphicsDevice.SetRenderTargets(rtb); updateCachedTexture = false; } // テクスチャにレンダリングされたマンデルブロ集合のイメージをそのまま表示する effect.Parameters["cachedTexture"].SetValue((Texture2D)renderTarget); effect.CurrentTechnique = effect.Techniques["Cached"]; GraphicsDevice.SetVertexBuffer(vb); foreach(EffectPass pass in effect.CurrentTechnique.Passes) { pass.Apply(); GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); } effect.Parameters["cachedTexture"].SetValue((Texture2D)null); base.Draw(gameTime); } } class Program { static void Main() { using (Game1 game = new Game1()) { game.IsMouseVisible = true; game.Run(); } } } Mandelbrot_3.fx float Aspect = 1.0f; float Zoom = 1.0f; float2 Offset = float2(0.0f, 0.0f); texture colorMapTexture; texture cachedTexture; // サンプラー sampler ColorMap = sampler_state { Texture = colorMapTexture ; MinFilter = Linear; MagFilter = Linear; MipFilter = Linear; AddressU = Wrap; }; sampler CachedMap = sampler_state { Texture = cachedTexture ; MinFilter = Linear; MagFilter = Linear; MipFilter = Linear; AddressU = Wrap; }; // 構造体 struct VertexIn { float2 Pos POSITION; float2 UV TEXCOORD0; }; struct VertexOut { float4 ScreenPos POSITION; float2 UV TEXCOORD0; }; struct PixelIn { float2 UV TEXCOORD0; }; struct PixelOut { float4 Color COLOR0; }; // Mandelbrot VertexOut MandelbrotVS(VertexIn input) { VertexOut output; output.ScreenPos = float4(input.Pos, 0.0f, 1.0f); output.UV = (input.UV - 0.5f) * float2(1.0f, -Aspect) * Zoom + Offset; return output; } PixelOut GetMandelbrotColor(int n, uniform int MaxIterate) { PixelOut output; if (n MaxIterate) { float u = (float)n / (float)MaxIterate; output.Color.rgb = tex1D(ColorMap, 2.0f * u); } else { output.Color.rgb = 0.0f; } output.Color.a = 1.0f; return output; } PixelOut MandelbrotPSImpl(PixelIn input, uniform int MaxIterate) { float2 p = 0; int n; for (n = 0; n MaxIterate dot(p, p) 4.0f; n++) { p = float2(p.x * p.x - p.y * p.y, 2.0f * p.x * p.y) + input.UV; } return GetMandelbrotColor(n, MaxIterate); } PixelOut MandelbrotPSImpl(PixelIn input, uniform int Loop1, uniform int Loop2) { const int MaxIterate = Loop1 * 128 + Loop2; float2 p = 0; bool finite = true; int n = 0; for (int j = 0; j Loop1 finite; j++) { for (int i = 0; i 128 finite; i++) { p = float2(p.x * p.x - p.y * p.y, 2.0f * p.x * p.y) + input.UV; finite = dot(p, p) 4.0f; n++; } } if (Loop2 0) { for (int j = 0; j Loop2 dot(p, p); j++) { p = float2(p.x * p.x - p.y * p.y, 2.0f * p.x * p.y) + input.UV; n++; } } return GetMandelbrotColor(n, MaxIterate); } PixelOut MandelbrotPS(PixelIn input, uniform int MaxIterate) { if (MaxIterate 254) { return MandelbrotPSImpl(input, MaxIterate / 128, MaxIterate % 128); } else { return MandelbrotPSImpl(input, MaxIterate); } } // CachedImage VertexOut CachedImageVS(VertexIn input) { VertexOut output; output.ScreenPos = float4(input.Pos, 0.0f, 1.0f); output.UV = input.UV; return output; } PixelOut CachedImageShader(PixelIn input) { PixelOut output; output.Color = tex2D(CachedMap, input.UV); return output; } // レンダー technique Mandelbrot { pass Pass0 { VertexShader = compile vs_3_0 MandelbrotVS(); PixelShader = compile ps_3_0 MandelbrotPS(128); } } technique Cached { pass Pass0 { VertexShader = compile vs_3_0 CachedImageVS(); PixelShader = compile ps_3_0 CachedImageShader(); } }
https://w.atwiki.jp/sampleisbest/pages/279.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 プロジェクト プロジェクト名 FreqMod アプリケーションの種類 Windows アプリケーション 追加のオプション 空のプロジェクト 文字セット Unicode FreqMod.cpp // FreqMod2 FM音源での音の作り方 #pragma comment(lib, "winmm") #define _USE_MATH_DEFINES #include Windows.h #include tchar.h #include math.h #define SAFE_FREE(p)if (p) { free(p); p = NULL; } #define APP_NAMETEXT("FreqMod") #define SAMPLING_RATE44100 // LFO(Low Frequency Oscillator) 低周波発信器 // EG(Envelop Generator) struct VoiceParam { char Feedback_Algorithm;// 未使用 char OperatorMask;// 未使用 char WaveForm;// 未使用 0 ノコギリ波 char Sync;// 未使用 0 Key-onと無関係にLFOが動作 short Speed;// 未使用 LFOの速度(0 - 16383) char PitchModulationDepth;// 未使用 音程に対してLFOをかける深さ(-127 - 127) char AmplitudeModulationDepth;// 未使用 音量に対してLFOをかける深さ(-127 - 127) char PitchModulationSensitivity;// 未使用 音程に対するLFOをかける度合(0 - 15) }; struct OperatorParam { char AR;// 未使用 Attack Rate(0 - 31) char DR;// 未使用 Decay Rate(0 - 31) char SR;// 未使用 Sustain Rate(0 - 31) char RR;// 未使用 Release Rate(0 - 15) char SL;// 未使用 Sustain Level(0 - 15) char OutputLevel;// 減衰量(127 - 0) 0が最大出力 char KeyboardRateScalingDepth;// 未使用 高音になるほどEGの変化速度を速くする度合(0 - 3) char Multiple;// 周波数比(0 - 15) 0=1/2 char Detune;// 未使用 音程のずれの度合(-3 - 3) char AMS;// Amplitude Modulation Sensitivity(0 - 15) }; // 関数プロトタイプ宣言 void CmdVoice0(void); void CmdVoice1(void); double Operator(const OperatorParam op, double pitch, double mod); void Trace(LPCTSTR format, ...); LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void OnCreate(HWND hWnd); void OnSize(HWND hWnd, WPARAM wParam, LPARAM lParam); void OnHScroll(HWND hWnd, WPARAM wParam); void OnPaint(HWND hWnd); void OnChar(HWND hWnd, WPARAM wParam, LPARAM lParam); void Play(HWND hWnd); void OnWomOpen(void); void OnWomDone(HWND hWnd); // 音階 const int scale[] = {3, 5, 7, 8, 10, 12, 14, 15}; // 外部変数 SCROLLINFO siHorz; int sampleLength; PBYTE waveformData = NULL; HWAVEOUT hwo; WAVEHDR wh; HCURSOR hCursor = NULL; VoiceParam vp; OperatorParam op[4]; //============================================================================== int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) { CmdVoice0(); // ウィンドウクラスの登録 WNDCLASSEX wcx; ZeroMemory( wcx, sizeof wcx); wcx.cbSize= sizeof wcx; wcx.style= CS_HREDRAW | CS_VREDRAW; wcx.lpfnWndProc= WndProc; wcx.hInstance= hInstance; wcx.hCursor= LoadCursor(NULL, IDC_ARROW); wcx.hbrBackground= HBRUSH(COLOR_WINDOW + 1); wcx.lpszClassName= APP_NAME; if (RegisterClassEx( wcx) == 0) { return 0; } // ウィンドウの作成 HWND hWnd = CreateWindow( APP_NAME, APP_NAME, WS_OVERLAPPEDWINDOW | WS_HSCROLL, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (hWnd == NULL) { return 0; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // メッセージループ MSG msg; while (GetMessage( msg, NULL, 0, 0)) { TranslateMessage( msg); DispatchMessage( msg); } SAFE_FREE(waveformData); return msg.wParam; } void CmdVoice0(void) { op[0].OutputLevel = 32; op[0].Multiple = 12; op[1].OutputLevel = 57; op[1].Multiple = 15; op[2].OutputLevel = 30; op[2].Multiple = 1; op[3].OutputLevel = 0; op[3].Multiple = 3; sampleLength = SAMPLING_RATE * 4; waveformData = (PBYTE)malloc(sampleLength); int i = 0; for (int n = 0; n 8; n++) { for (int t = 0; t SAMPLING_RATE / 2; t++) { double freq = 440.0 * pow(pow(2.0, scale[n]), 1.0/12); double pitch = fmod(freq * t / SAMPLING_RATE, 1); // Algorithm=2 double output0 = Operator(op[0], pitch, 0); double output1 = Operator(op[1], pitch, 0); double output2 = Operator(op[2], pitch, output1); double output3 = Operator(op[3], pitch, (output0 + output2) / 2); //double output3 = Operator(op[2], pitch, 0); waveformData[i++] = BYTE(128 + 64 * output3); } } } void CmdVoice1(void) { op[0].OutputLevel = 112; op[0].Multiple = 1; op[1].OutputLevel = 0; op[1].Multiple = 1; sampleLength = SAMPLING_RATE; waveformData = (PBYTE)malloc(sampleLength); for (int i = 0; i sampleLength; i++) { double pitch = fmod(440.0 * i / SAMPLING_RATE, 1); // OP.1 モジュレータ double output0 = Operator(op[0], pitch, 0); // OP.2 キャリア double output1 = Operator(op[1], pitch, output0); waveformData[i] = BYTE(128 + 64 * output1); } } // 正弦波発振器 double Operator(const OperatorParam op, double pitch, double mod) { pitch = fmod(pitch * op.Multiple, 1); double add = pitch + mod; // 加算器 double output = sin(2 * M_PI * add) * (128 - op.OutputLevel) / 128; return output; } void Trace(LPCTSTR format, ...) { va_list arg_ptr; TCHAR buffer[256]; int size; va_start(arg_ptr, format); size = _vsntprintf_s(buffer, _countof(buffer), _TRUNCATE, format, arg_ptr); va_end(arg_ptr); OutputDebugString(buffer); if (size 0) { OutputDebugString(_T("...\n")); } } //------------------------------------------------------------------------------ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case MM_WOM_OPEN OnWomOpen(); return 0; case MM_WOM_DONE OnWomDone(hWnd); return 0; case WM_PAINT OnPaint(hWnd); return 0; case WM_HSCROLL OnHScroll(hWnd, wParam); return 0; case WM_SIZE OnSize(hWnd, wParam, lParam); return 0; case WM_CHAR OnChar(hWnd, wParam, lParam); return 0; case WM_CREATE OnCreate(hWnd); return 0; case WM_DESTROY PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } void OnCreate(HWND hWnd) { RECT rc; GetClientRect(hWnd, rc); siHorz.cbSize= sizeof siHorz; siHorz.fMask= SIF_RANGE | SIF_PAGE | SIF_POS | SIF_DISABLENOSCROLL; siHorz.nMin= 0; siHorz.nMax= SAMPLING_RATE - 1; siHorz.nPage= rc.right; siHorz.nPos= 0; SetScrollInfo(hWnd, SB_HORZ, siHorz, FALSE); } void OnSize(HWND hWnd, WPARAM wParam, LPARAM lParam) { if (wParam == SIZE_MINIMIZED) return; siHorz.nPage= LOWORD(lParam); int nPosMax= max(siHorz.nMax - (int)siHorz.nPage + 1, 0); siHorz.nPos= min(siHorz.nPos, nPosMax); SetScrollInfo(hWnd, SB_HORZ, siHorz, TRUE); } void OnHScroll(HWND hWnd, WPARAM wParam) { int nPos = siHorz.nPos; switch (LOWORD(wParam)) { case SB_LINEUP nPos -= 10; break; case SB_LINEDOWN nPos += 10; break; case SB_PAGEUP nPos -= siHorz.nPage; break; case SB_PAGEDOWN nPos += siHorz.nPage; break; case SB_THUMBTRACK SCROLLINFO si; si.cbSize= sizeof si; si.fMask= SIF_TRACKPOS; if (GetScrollInfo(hWnd, SB_HORZ, si) != 0) { nPos = si.nTrackPos; } break; } int nPosMax = max(siHorz.nMax - (int)siHorz.nPage + 1, 0); nPos = min(nPos, nPosMax); nPos = max(nPos, 0); if (nPos == siHorz.nPos) return; ScrollWindowEx(hWnd, siHorz.nPos - nPos, 0, NULL, NULL, NULL, NULL, SW_INVALIDATE | SW_ERASE); siHorz.nPos = nPos; SetScrollInfo(hWnd, SB_HORZ, siHorz, TRUE); UpdateWindow(hWnd); } void OnPaint(HWND hWnd) { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, ps); RECT rc; GetClientRect(hWnd, rc); //Trace(_T("OnPaint %d %d\n"), ps.rcPaint.left, ps.rcPaint.right); // waveform HPEN pen = CreatePen(PS_SOLID, 0, RGB(0,0,255)); HGDIOBJ penOld = SelectObject(hdc, pen); for (int x = ps.rcPaint.left; x ps.rcPaint.right; x++) { size_t i = siHorz.nPos + x; if (SAMPLING_RATE = i) break; MoveToEx(hdc, x, rc.bottom / 2, NULL); LineTo(hdc, x, rc.bottom * (255 - waveformData[i]) / 256); } SelectObject(hdc, penOld); DeleteObject(pen); EndPaint(hWnd, ps); } void OnChar(HWND hWnd, WPARAM wParam, LPARAM lParam) { Trace(_T("OnChar %x %x\n"), wParam, lParam); switch (wParam) { case VK_ESCAPE DestroyWindow(hWnd); break; case p Play(hWnd); break; } } void Play(HWND hWnd) { if (hCursor) return; WAVEFORMATEX wf; wf.wFormatTag= WAVE_FORMAT_PCM; wf.wBitsPerSample= 8; wf.nChannels= 1; wf.nSamplesPerSec= SAMPLING_RATE; wf.nBlockAlign= (wf.wBitsPerSample / 8) * wf.nChannels; wf.nAvgBytesPerSec= wf.nSamplesPerSec * wf.nBlockAlign; wf.cbSize= 0; MMRESULT mmr = waveOutOpen( hwo, WAVE_MAPPER, wf, (DWORD_PTR)hWnd, 0, CALLBACK_WINDOW); if (mmr != MMSYSERR_NOERROR) { Trace(_T("waveOutOpen\n")); return; } HCURSOR hWait = LoadCursor(NULL, IDC_WAIT); hCursor = SetCursor(hWait); SetClassLong(hWnd, GCL_HCURSOR, (LONG)hWait); } void OnWomOpen(void) { wh.lpData= (LPSTR)waveformData; wh.dwBufferLength= sampleLength; wh.dwBytesRecorded= 0; wh.dwUser= 0; wh.dwFlags= 0; wh.dwLoops= 0; wh.lpNext= NULL; wh.reserved= 0; MMRESULT mmr = waveOutPrepareHeader(hwo, wh, sizeof wh); if (mmr != MMSYSERR_NOERROR) { Trace(_T("waveOutPrepareHeader\n")); return; } wh.dwFlags|= WHDR_BEGINLOOP | WHDR_ENDLOOP; wh.dwLoops= 1; mmr = waveOutWrite(hwo, wh, sizeof wh); if (mmr != MMSYSERR_NOERROR) { Trace(_T("waveOutWrite\n")); } } void OnWomDone(HWND hWnd) { Trace(_T("OnWomDone\n")); waveOutReset(hwo); waveOutUnprepareHeader(hwo, wh, sizeof wh); waveOutClose(hwo); SetCursor(hCursor); SetClassLong(hWnd, GCL_HCURSOR, (LONG)hCursor); hCursor = NULL; }
https://w.atwiki.jp/sampleisbest/pages/177.html
開発環境 Microsoft Visual C# 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Windows Game (4.0) プロジェクト名 XnaShader .fxファイルの追加方法 ソリューション エクスプローラーのContentに新しい項目を追加。 テンプレート:Effect File ビルド時に以下のエラーが発生した場合 XNA Framework Reach profile does not support vertex shader model 3.0. プロジェクトのプロパティを開く。 XNA Game Studioタブを選択する。 Game profileに[Use HiDef to access the complete API]を選択する。 参考 プログラマブル・シェーダによる積極的なGPUの活用 - @IT Program.cs using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; class Game1 Game { GraphicsDeviceManager graphics; VertexBuffer vb; Effect effect; // 頂点構造体 struct MyVertex IVertexType { Vector2 Position; Vector2 UV; public MyVertex(Vector2 position, Vector2 uv) { Position = position; UV = uv; } public readonly static VertexDeclaration VertexDeclaration = new VertexDeclaration( new VertexElement[] { new VertexElement(0, VertexElementFormat.Vector2, VertexElementUsage.Position, 0), new VertexElement(8, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 0), }); VertexDeclaration IVertexType.VertexDeclaration { get { return VertexDeclaration;} } } public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; Window.AllowUserResizing = true; } protected override void LoadContent() { const int numVertices = 4; vb = new VertexBuffer(GraphicsDevice, typeof(MyVertex), numVertices, BufferUsage.None); MyVertex[] vertices = new MyVertex[numVertices] { new MyVertex(new Vector2(-1.0f, 1.0f), new Vector2(0.0f, 1.0f)), // LU new MyVertex(new Vector2( 1.0f, 1.0f), new Vector2(1.0f, 1.0f)), // RU new MyVertex(new Vector2(-1.0f, -1.0f), new Vector2(0.0f, 0.0f)), // LD new MyVertex(new Vector2( 1.0f, -1.0f), new Vector2(1.0f, 0.0f)), // RD }; vb.SetData(vertices); // ContentにSimple.fxを追加しておく effect = Content.Load Effect ("Simple"); base.LoadContent(); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); GraphicsDevice.SetVertexBuffer(vb); foreach(EffectPass pass in effect.CurrentTechnique.Passes) { pass.Apply(); GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); } base.Draw(gameTime); } } class Program { static void Main() { using (Game1 game = new Game1()) { game.IsMouseVisible = true; game.Run(); } } } Simple.fx // 頂点シェーダ struct VertexIn { float2 Pos POSITION; float2 UV TEXCOORD0; }; struct VertexOut { float4 ScreenPos POSITION; float2 UV TEXCOORD0; }; VertexOut MyVertexShader(VertexIn input) { VertexOut output; output.ScreenPos = float4(input.Pos, 0.0f, 1.0f); output.UV = input.UV; return output; } // ピクセルシェーダ struct PixelIn { float2 UV TEXCOORD0; }; struct PixelOut { float4 Color COLOR0; }; PixelOut MyPixelShader(PixelIn input) { PixelOut output; output.Color = float4(input.UV, 0.0f, 1.0f); return output; } // レンダー technique Render { pass Pass0 { VertexShader = compile vs_3_0 MyVertexShader(); PixelShader = compile ps_3_0 MyPixelShader(); } }
https://w.atwiki.jp/sampleisbest/pages/520.html
開発環境 Microsoft Visual Studio Community 2017 実行環境 Microsoft Windows 10 Home (64-bit) プロジェクトの種類 Visual C++ / 空のプロジェクト プロジェクト名 waveloop3 waveloop3.cpp // プロジェクトのプロパティ // Unicode文字セット #pragma comment(lib, "winmm") #include Windows.h #include wchar.h #include vector #include "Resource.h" using namespace std; typedef struct { int msec; int freq; } Sequence; #define SAMPLE_RATE 44100 #define BUFFERS 2 #define BUF_LEN 2048 #define TIMEBASE 24 // 関数プロトタイプ宣言 void Trace(LPCWSTR format, ...); INT_PTR CALLBACK MainDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); void Init(); void Timer(HWND hDlg); void GenerateWaveForm(LPWAVEHDR pwh); void Play(HWND hDlg); void Stop(HWND hDlg); void SetFreq(int freq); // グローバル変数 HWAVEOUT hwo = NULL; WAVEHDR wh[BUFFERS]; BYTE waveform[BUFFERS][BUF_LEN]; bool playing = false; int wavefreq; int phase; vector Sequence seq; int nseq; DWORD start; int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDLG), NULL, MainDlg); return 0; } void Trace(LPCWSTR format, ...) { va_list arg_ptr; WCHAR buffer[256]; va_start(arg_ptr, format); int size = _vsnwprintf_s(buffer, _TRUNCATE, format, arg_ptr); va_end(arg_ptr); OutputDebugString(buffer); } INT_PTR CALLBACK MainDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { INT_PTR ret = TRUE;// メッセージを処理した switch (message) { case MM_WOM_DONE if (playing) { Timer(hDlg); GenerateWaveForm((LPWAVEHDR)lParam); } break; //case MM_WOM_OPEN //case MM_WOM_CLOSE case WM_COMMAND switch (LOWORD(wParam)) { case IDC_PLAY Play(hDlg); break; case IDC_STOP Stop(hDlg); break; case IDCANCEL EndDialog(hDlg, IDCANCEL); break; } break; case WM_INITDIALOG Init(); ret = TRUE;// SetFocusでフォーカスを設定した場合はFALSE break; case WM_CLOSE Stop(hDlg); ret = FALSE; break; default ret = FALSE;// メッセージを処理しなかった } return ret; } void Init() { int tempo = 120; int notes[] = { 60, 24, 62, 24, 64, 24, 65, 24, 64, 24, 62, 24, 60, 24, 0, 24, }; Sequence s; int elapse = 100;// wait for (int i = 0; i _countof(notes); i += 2) { int gate = (int)((notes[i + 1] / (double)TIMEBASE) * (60.0 / tempo) * 1000); s.msec = elapse; s.freq = (notes[i] == 0) ? 0 (int)(440 * pow(2, (notes[i] - 69) / 12.0)); seq.push_back(s); elapse += gate; } s.msec = elapse; s.freq = 0; seq.push_back(s); } void Timer(HWND hDlg) { int dur = (int)(GetTickCount() - start); if (seq[nseq].msec = dur) { SetFreq(seq[nseq].freq); nseq++; if ((int)(seq.size()) = nseq) Stop(hDlg); } } void GenerateWaveForm(LPWAVEHDR pwh) { LPBYTE data = (LPBYTE)(pwh- lpData); for (int i = 0; i BUF_LEN; i++) { phase += wavefreq; if (SAMPLE_RATE = phase) phase -= SAMPLE_RATE; double t = phase / (double)SAMPLE_RATE; data[i] = 128 + (t 0.5 ? 1 -1) * 10; } waveOutWrite(hwo, pwh, sizeof WAVEHDR); } //// void Play(HWND hDlg) { Trace(L"Play()\n"); EnableWindow(GetDlgItem(hDlg, IDC_PLAY), FALSE); playing = true; SetFreq(0); nseq = 0; start = GetTickCount(); MMRESULT mmr; WAVEFORMATEX wfx; wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = 1; wfx.nSamplesPerSec = SAMPLE_RATE; wfx.nAvgBytesPerSec = SAMPLE_RATE; wfx.nBlockAlign = 1; wfx.wBitsPerSample = 8; wfx.cbSize = 0; mmr = waveOutOpen( hwo, WAVE_MAPPER, wfx, (DWORD_PTR)hDlg, NULL, CALLBACK_WINDOW); Trace(L"waveOutOpen %u\n", mmr); for (int i = 0; i BUFFERS; i++) { LPWAVEHDR pwh = wh + i; pwh- lpData = (LPSTR)(waveform[i]); pwh- dwBufferLength = BUF_LEN; pwh- dwFlags = 0; mmr = waveOutPrepareHeader(hwo, pwh, sizeof WAVEHDR); Trace(L"waveOutPrepareHeader %d %u\n", i, mmr); GenerateWaveForm(pwh); } } void Stop(HWND hDlg) { Trace(L"Stop()\n"); EnableWindow(GetDlgItem(hDlg, IDC_PLAY), TRUE); playing = false; if (hwo) { MMRESULT mmr; mmr = waveOutReset(hwo); Trace(L"waveOutReset %u\n", mmr); for (int i = 0; i BUFFERS; i++) { mmr = waveOutUnprepareHeader(hwo, wh + i, sizeof WAVEHDR); Trace(L"waveOutUnprepareHeader %d %u\n", i, mmr); } mmr = waveOutClose(hwo); Trace(L"waveOutClose %u\n", mmr); hwo = NULL; } } void SetFreq(int freq) { wavefreq = freq; phase = 0; } Resource.h #define IDD_MAINDLG100 //#define IDT_TIMER101 #define IDC_STATIC-1 #define IDC_PLAY1000 #define IDC_STOP1001 waveloop3.rc // resource script #include windows.h #include "resource.h" IDD_MAINDLG DIALOGEX 100, 100, 320, 200 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_APPWINDOW CAPTION "waveloop3" FONT 9, "MS UI Gothic" BEGIN PUSHBUTTON"Play( P)", IDC_PLAY, 10, 10, 50, 15 PUSHBUTTON"Stop( S)", IDC_STOP, 70, 10, 50, 15 END
https://w.atwiki.jp/sampleisbest/pages/226.html
開発環境 Microsoft Visual C# 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Windows Game (4.0) プロジェクト名 XnaSphere Game1.cs // XnaSphere1 - XNA 球体(球面線形補間) using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; namespace XnaSphere { class Game1 Game { GraphicsDeviceManager graphics; SpriteBatch sprite; SpriteFont font; BasicEffect effect; VertexBuffer vertexBuffer; IndexBuffer indexBuffer; // fps int sec; int draw = 0; int fps = 0; // カメラ int camLat = 0; int camLong = 90; float camDist = 5; public Game1() { graphics = new GraphicsDeviceManager(this); graphics.PreferredBackBufferWidth = 1280; graphics.PreferredBackBufferHeight = 720; Content.RootDirectory = "Content"; IsMouseVisible = true; } protected override void LoadContent() { font = Content.Load SpriteFont ("SpriteFont1"); sprite = new SpriteBatch(GraphicsDevice); effect = new BasicEffect(GraphicsDevice); //effect.VertexColorEnabled = true; //effect.EnableDefaultLighting(); effect.Projection = Matrix.CreatePerspectiveFieldOfView( MathHelper.ToRadians(45), GraphicsDevice.Viewport.AspectRatio, 1, 100); // 頂点バッファ int stackNum = 16; // 輪切りの数 int[] dir = { 0, 1, 0, -1, 0, 1 }; // 方向配列 VertexPositionColor[] vertices = new VertexPositionColor[stackNum * stackNum + 2]; int i = 0; vertices[i++] = new VertexPositionColor(new Vector3(0, 1, 0), Color.Yellow); for (int stack = 1; stack stackNum; stack++) { float rad = ((stackNum - 2 * stack) / (float)stackNum) * MathHelper.PiOver2; float y = (float)Math.Sin(rad); float r = (float)Math.Cos(rad); int sliceNum = Math.Min(stack, stackNum - stack); // 1象限内の頂点数 for (int quad = 0; quad 4; quad++) // 4象限 { Quaternion q1 = new Quaternion(dir[quad + 1] * r, y, dir[quad + 0] * r, 0); Quaternion q2 = new Quaternion(dir[quad + 2] * r, y, dir[quad + 1] * r, 0); for (int slice = 0; slice sliceNum; slice++) { // 球面線形補間 Quaternion q = Quaternion.Slerp(q1, q2, slice / (float)sliceNum); q.Normalize(); Vector3 normal = new Vector3(q.X, q.Y, q.Z); vertices[i++] = new VertexPositionColor( normal, (i 1) == 0 ? Color.Red Color.Yellow); } } } vertices[i++] = new VertexPositionColor(new Vector3(0, -1, 0), Color.Yellow); vertexBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionColor), vertices.Length, BufferUsage.WriteOnly); vertexBuffer.SetData(vertices); // 索引バッファ short[] indices = new short[stackNum * stackNum * 6]; i = 0; int prevHead = 0; // 前の先頭頂点番号 int prevVtx = 1; // 前の頂点数 for (int stack = 0; stack stackNum / 2; stack++) { int currHead = prevHead + prevVtx; // 現在の先頭頂点番号 int currVtx = 4 * (stack + 1); // 現在の頂点数 for (int quad = 0; quad 4; quad++) // 4象限 { int prevQuad = quad * stack; // 前の象限オフセット int currQuad = quad * (stack + 1); // 現在の象限オフセット for (int n = 0; ; n++) { indices[i++] = (short)(prevHead + (prevQuad + n) % prevVtx); indices[i++] = (short)(currHead + (currQuad + n)); indices[i++] = (short)(currHead + (currQuad + n + 1) % currVtx); if (stack = n) break; indices[i++] = (short)(prevHead + (prevQuad + n)); indices[i++] = (short)(currHead + (currQuad + n + 1)); indices[i++] = (short)(prevHead + (prevQuad + n + 1) % prevVtx); } } prevHead = currHead; prevVtx = currVtx; } for (int stack = stackNum / 2 - 1; 0 = stack; stack--) { int currHead = prevHead + prevVtx; int currVtx = Math.Max(4 * stack, 1); for (int quad = 0; quad 4; quad++) // 4象限 { int prevQuad = quad * (stack + 1); int currQuad = quad * stack; for (int n = 0; ; n++) { indices[i++] = (short)(currHead + (currQuad + n) % currVtx); indices[i++] = (short)(prevHead + (prevQuad + n + 1) % prevVtx); indices[i++] = (short)(prevHead + (prevQuad + n)); if (stack = n) break; indices[i++] = (short)(currHead + (currQuad + n)); indices[i++] = (short)(currHead + (currQuad + n + 1) % currVtx); indices[i++] = (short)(prevHead + (prevQuad + n + 1)); } } prevHead = currHead; prevVtx = currVtx; } indexBuffer = new IndexBuffer(GraphicsDevice, typeof(short), indices.Length, BufferUsage.WriteOnly); indexBuffer.SetData(indices); base.LoadContent(); } protected override void Update(GameTime gameTime) { KeyboardState kState = Keyboard.GetState(); if (kState.IsKeyDown(Keys.Escape)) Exit(); if (kState.IsKeyDown(Keys.Up)) camLat++; if (kState.IsKeyDown(Keys.Down)) camLat--; if (kState.IsKeyDown(Keys.Left)) camLong = (camLong + 1) % 360; if (kState.IsKeyDown(Keys.Right)) camLong = (camLong + 359) % 360; if (kState.IsKeyDown(Keys.PageUp)) camDist -= 0.1f; if (kState.IsKeyDown(Keys.PageDown)) camDist += 0.1f; base.Update(gameTime); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); GraphicsDevice.RasterizerState = new RasterizerState { FillMode = FillMode.WireFrame }; // カメラ位置 float rad = MathHelper.ToRadians(camLat); float y = (float)Math.Sin(rad) * camDist; float r = (float)Math.Cos(rad) * camDist; rad = MathHelper.ToRadians(camLong); float x = (float)Math.Cos(rad) * r; float z = (float)Math.Sin(rad) * r; effect.View = Matrix.CreateLookAt(new Vector3(x, y, z), Vector3.Zero, Vector3.Up); GraphicsDevice.SetVertexBuffer(vertexBuffer); GraphicsDevice.Indices = indexBuffer; foreach (EffectPass pass in effect.CurrentTechnique.Passes) { pass.Apply(); GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertexBuffer.VertexCount, 0, indexBuffer.IndexCount / 3); } // fps draw++; if (gameTime.TotalGameTime.Seconds != sec) { fps = draw; draw = 0; sec = gameTime.TotalGameTime.Seconds; } sprite.Begin(); string text = String.Format( "fps={0} lat={1} long={2} dist={3 f1}", fps, camLat, camLong, camDist); sprite.DrawString(font, text, new Vector2(0, 0), Color.White); sprite.End(); base.Draw(gameTime); } } }
https://w.atwiki.jp/hmiku/pages/25853.html
【検索用 しょうねんとまほうのろほっとVOCALOIDBESTNEWRECORDINGS 登録タグ 40㍍PCD 40㍍PCDソロ CD CDし たまCD 全国発売】 + 目次 目次 CD紹介 曲目 リンク コメント 前作 本作 次作 シンタイソクテイ 少年と魔法のロボット VOCALOID BEST,NEW RECORDINGS キミボシ 40㍍P たま [TEST] 発売:2013年9月18日 価格:¥2,500(税込) 流通:全国 レーベル:due CD紹介 CD名:『少年と魔法のロボット VOCALOID BEST,NEW RECORDINGS』(しょうねんとまほうのろぼっと VOCALOID BEST,NEW RECORDINGS) NHK「みんなのうた」オンエア「少年と魔法のロボット」を含む全曲フルバンドによる新レコーディング。ニコニコ動画100万再生越え5曲を含む40mPボーカロイドソングベストアルバム。 虹色オーケストラメンバーを含む総勢12名のミュージシャンがこのアルバムのために集結! ブラス、ストリングス、全曲フルバンド、生楽器によるレコーディングで「からくりピエロ」、「ドレミファロンド」、「トリノコシティ」…40mP名曲の数々が蘇る! 収録楽曲のメグッポイド(GUMI)ボーカルによる「少年と魔法のロボット」がNHK「みんなのうた」の2013年8月・9月のオンエア決定。「みんなのうた」のラインナップに人間の声以外で歌われた曲が選出されるのは番組史上初。今回収録されるのはそのフルサイズver。 レコーディング ミックスエンジニアは福山雅治、今井美樹、井上陽介、スキマスイッチ等、数々のアルバムを手がけてきた三浦瑞生。 ジャケットイラストは「少年と魔法のロボット」の動画も担当しているたま氏。 参加ミュージシャン事務員G(Piano)、[TEST](Guitar)、mao(Bass)、岩永真奈(Bass)、ショボン(Drum Percussion)、湯本淳希(Trumpet)、西村貴行(Alto Tenor Sax)、和田充弘(Trombone) String Section 玉響MIZ(1st Violin)、MariNa(2nd Violin)、あかりんご(Viora)、まゆみ(Cello) 曲目 少年と魔法のロボット(Album Edit Ver.) / 40mP feat. GUMI Melody in the sky / 40mP feat. 初音ミク Step to you / 40mP feat. 初音ミク 巨大少女 / 40mP feat. 初音ミク ジェンガ / 40mP feat. 初音ミク トリノコシティ / 40mP feat. 初音ミク 妄想スケッチ / 40mP feat. 初音ミク キリトリセン / 40mP feat. GUMI 夢地図 / 40mP feat. GUMI からくりピエロ / 40mP feat. 初音ミク シリョクケンサ / 40mP feat. GUMI ドレミファロンド / 40mP feat. 初音ミク 春に一番近い街 / 40mP feat. GUMI 東京の真ン中で寝転ぶ 40mP feat. 初音ミク 千年橋と影法師 / 40mP feat. 初音ミク コトバのうた / 40mP feat. 初音ミク・GUMI 全16曲 リンク Amazon ナタリー記事 コメント 追加おつです -- 名無しさん (2013-06-16 20 28 11) イメージ画像吹いたww欲しいな! -- 名無しさん (2013-06-16 20 51 04) まさに40㍍Pさんの集大成的なアルバムやね。全曲生演奏とか胸が熱い。 -- 竜奇 (2013-06-16 21 33 44) 最近全国アルバム出たばっかじゃね?って思ったら生演奏か、なにこれすげぇ -- 名無しさん (2013-06-16 21 57 33) 生演奏とか。40mさんも偉くなったなぁww -- 名無しさん (2013-06-17 08 38 59) 40さんホントにどんどんすごくなってくなぁ、プロ並みだよねw -- 名無しさん (2013-06-17 09 35 54) 40さんほんとすごい!おめでとう!絶対買うよ! -- ゴル (2013-06-17 19 14 09) 40さんは神より神! -- 名無しさん (2013-06-17 19 17 30) メイトは予約まだっぽい。はやく始まれ! -- 名無しさん (2013-06-17 20 34 58) 初期曲から人気曲まで、選曲が良すぎ!!絶対買います! -- 名無しさん (2013-06-17 21 04 45) 雨とアスファルト入らないのか…( _ ) -- 名無しさん (2013-06-17 23 15 34) 40㍍Pの少年と魔法のロボットが気になる^^ -- 名無しさん (2013-06-18 18 03 48) 40さんほんとすごいなぁ 奏者さんも豪華だし、アルバム楽しみ! -- 名無しさん (2013-06-18 18 29 50) 買うに決まってる -- 名無しさん (2013-06-18 18 41 01) 素敵な曲ばっかり!!(*≧∀≦*)待機!! -- POKUNA (2013-06-18 19 33 53) 買います! -- ゴリラ (2013-07-04 20 46 32) 金がねぇwwです。頑張って貯金しましょう。 -- 神奈川に潜むもの (2013-07-04 21 32 53) 少年と魔法のロボットがはやく聴きたい!! -- れいん (2013-07-12 14 21 15) ある意味人生かかってるし、本気という本気を出してるな。 -- 名無しさん (2013-07-16 06 38 38) ほすい -- 名無しさん (2013-08-01 21 28 28) 8月9日が待ち遠しいですね!! -- 名無しさん (2013-08-02 09 32 47) ↑ミスった9月ですw -- 名無しさん (2013-08-02 09 35 09) ジャケットイラスト可愛い -- 名無しさん (2013-08-05 10 32 50) すごい!みんなのうた出るんだ! -- 名無しさん (2013-08-05 12 09 40) 40mP様さいっこー☆* .。. o(≧ー≦)o .。. *☆ -- 名無しさん (2013-08-07 15 35 23) 『少年と魔法のロボット』をみんなのうたで聴いてマジで感動した…!はやくフルが聴きたい!! -- 鈴 (2013-08-08 17 34 09) 絶対買いますっ!少年と魔法のロボットすごかたです -- 名無しさん (2013-08-08 17 48 33) からくりピエロ入ってる時点で絶対買います。あと魔法のロボットとか春に一番近い街とか妄想スケッチとかトリノコシティとかシリョクケンサとかもう嬉しすぎます -- 花音ユウ (2013-08-14 13 18 55) コトバのうた入るのか…!ほしいな! -- 名無しさん (2013-08-19 09 45 39) 少年と魔法のロボットのフルが楽しみすぎます…!! -- 名無しさん (2013-08-27 20 07 56) ↑ですよね!! 『みんなのうた』でやっててびっくり 感動しました!! -- ぴより (2013-08-27 20 39 57) みんなのうたの楽譜で、やっと少年と魔法のロボットの全歌詞を知れた。 見るまでは、ラストハッピーエンドかな、バッドエンドかな…と悶々してたのでスッキリした。 楽譜の歌詞見たのが教室だったんだが、それでも感極まって泣きそうだったw -- 常和 (2013-09-06 07 31 22) みんなのうたはショートバージョンだから、フルバージョン楽しみです! -- 名無しさん (2013-09-08 13 23 12) 少年と魔法のロボット、NHKのみんなのうたで歌ってたよ。 -- 名無しさん (2013-09-09 20 37 34) 18日楽しみすぎる\(^o^)/ -- 名無しさん (2013-09-14 09 28 39) 今聴いてるけど、最高傑作!!アレンジいいし、全体的に優しい感じで素晴らしい! -- 名無しさん (2013-09-21 19 14 19) 過去作に収録された曲も演奏のおかげで別物みたいになってるね。タイトル曲は聴けば聴くほどいい曲。 -- 名無しさん (2013-09-30 21 18 50) 買ったぜ!!!!!! -- 40cmP (2013-11-05 07 21 05) 俺はこれのために新しいウォークマンと高いヘッドフォン買ったんだ。 -- ミク廃その○○そして40mP (2013-12-28 02 20 17) あ、名前ミスった -- ミク廃その○○ (2013-12-28 02 21 23) このCDの巨大少女がヤバイ。 -- ろんぐている (2014-01-21 21 21 05) 全体的に優しい感じになってた!買ってよかった -- 名無しさん (2014-02-01 23 54 38) 名前 コメント
https://w.atwiki.jp/orethebest/pages/6.html
更新履歴 @wikiのwikiモードでは #recent(数字) と入力することで、wikiのページ更新履歴を表示することができます。 詳しくはこちらをご覧ください。 =>http //atwiki.jp/guide/17_117_ja.html たとえば、#recent(20)と入力すると以下のように表示されます。 取得中です。
https://w.atwiki.jp/sampleisbest/pages/178.html
開発環境 Microsoft Visual C# 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Windows Game (4.0) プロジェクト名 XnaShader 参考 プログラマブル・シェーダによる積極的なGPUの活用 - @IT Program_2.cs // #2 using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; class Game1 Game { GraphicsDeviceManager graphics; VertexBuffer vb; Effect effect; Vector2 offset = new Vector2(-0.25f, 0.0f); float zoom = 3.0f; // 頂点構造体 struct MyVertex IVertexType { Vector2 Position; Vector2 UV; public MyVertex(Vector2 position, Vector2 uv) { Position = position; UV = uv; } public readonly static VertexDeclaration VertexDeclaration = new VertexDeclaration( new VertexElement[] { new VertexElement(0, VertexElementFormat.Vector2, VertexElementUsage.Position, 0), new VertexElement(8, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 0), }); VertexDeclaration IVertexType.VertexDeclaration { get { return VertexDeclaration;} } } public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; Window.AllowUserResizing = true; } protected override void LoadContent() { const int numVertices = 4; vb = new VertexBuffer(GraphicsDevice, typeof(MyVertex), numVertices, BufferUsage.None); MyVertex[] vertices = new MyVertex[numVertices] { new MyVertex(new Vector2(-1.0f, 1.0f), new Vector2(0.0f, 1.0f)), // LT new MyVertex(new Vector2( 1.0f, 1.0f), new Vector2(1.0f, 1.0f)), // RT new MyVertex(new Vector2(-1.0f, -1.0f), new Vector2(0.0f, 0.0f)), // LB new MyVertex(new Vector2( 1.0f, -1.0f), new Vector2(1.0f, 0.0f)), // RB }; vb.SetData(vertices); // ContentにMandelbrot.fxを追加しておく effect = Content.Load Effect ("Mandelbrot"); base.LoadContent(); } protected override void Update(GameTime gameTime) { // 移動量 float offsetMove = 0.01f * (float)Math.Log(zoom + 1.0f); KeyboardState key = Keyboard.GetState(); if (key.IsKeyDown(Keys.Left)) { offset.X -= offsetMove; } if (key.IsKeyDown(Keys.Right)) { offset.X += offsetMove; } if (key.IsKeyDown(Keys.Down)) { offset.Y -= offsetMove; } if (key.IsKeyDown(Keys.Up)) { offset.Y += offsetMove; } if (key.IsKeyDown(Keys.PageDown)) { zoom *= 1.05f; } if (key.IsKeyDown(Keys.PageUp)) { zoom /= 1.05f; } if (key.IsKeyDown(Keys.Escape)) { Exit(); } base.Update(gameTime); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); // エフェクトのパラメータ更新 effect.Parameters["Zoom"].SetValue(zoom); effect.Parameters["Aspect"].SetValue(GraphicsDevice.Viewport.AspectRatio); effect.Parameters["Offset"].SetValue(offset); GraphicsDevice.SetVertexBuffer(vb); foreach(EffectPass pass in effect.CurrentTechnique.Passes) { pass.Apply(); GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); } base.Draw(gameTime); } } class Program { static void Main() { using (Game1 game = new Game1()) { game.IsMouseVisible = true; game.Run(); } } } Mandelbrot_2.fx float Aspect = 1.0f; float Zoom = 1.0f; float2 Offset = float2(0.0f, 0.0f); // 頂点シェーダ struct VertexIn { float2 Pos POSITION; float2 UV TEXCOORD0; }; struct VertexOut { float4 ScreenPos POSITION; float2 UV TEXCOORD0; }; VertexOut MyVertexShader(VertexIn input) { VertexOut output; output.ScreenPos = float4(input.Pos, 0.0f, 1.0f); output.UV = input.UV; return output; } // ピクセルシェーダ struct PixelIn { float2 UV TEXCOORD0; }; struct PixelOut { float4 Color COLOR0; }; PixelOut MandelbrotShader(PixelIn input, uniform int MaxIterate) { const float2 c = (input.UV - 0.5f) * float2(1.0f, Aspect) * Zoom + Offset; float2 p = 0; int n; for (n = 0; n MaxIterate dot(p, p) 4.0f; n++) { p = float2(p.x * p.x - p.y * p.y, 2.0f * p.x * p.y) + c; } PixelOut output; if (n MaxIterate) { float u = (float)n / (float)MaxIterate; output.Color.rgb = float3(u, u, 1.0f - u); } else { output.Color.rgb = 0.0f; } output.Color.a = 1.0f; return output; } // レンダー technique Render { pass Pass0 { VertexShader = compile vs_3_0 MyVertexShader(); PixelShader = compile ps_3_0 MandelbrotShader(254); } }