Qualitative and quantitative sounds on auscultation in respiratory examination according to golwalla .
Golwalla Medicine auscultation respiratory qualitative quantitative sounds
| Sound | Site Normally Heard | Character | I:E Ratio |
|---|---|---|---|
| Vesicular | Over most of lung fields | Soft, low-pitched, rustling ("breeze through leaves"); inspiratory > expiratory with no pause | Insp: Exp = 3:1 |
| Bronchial (Tubular) | Over trachea & manubrium sterni | Loud, high-pitched, hollow/blowing; expiratory > inspiratory; gap between I & E | Insp: Exp = 1:2 |
| Bronchovesicular | 1st & 2nd ICS anteriorly; between scapulae posteriorly | Intermediate character; I = E with short pause | Insp: Exp = 1:1 |
| Type | Character | Timing | Causes |
|---|---|---|---|
| Fine (moist) crepitations | Soft, high-pitched, crackling ("rubbing hair near ear") | Late inspiratory | Pulmonary fibrosis, early pulmonary oedema, pneumonia |
| Medium crepitations | Medium pitch and intensity | Mid-inspiratory | Bronchiectasis, resolving pneumonia, pulmonary oedema |
| Coarse crepitations | Loud, low-pitched, "bubbling" | Early inspiratory or expiratory | Bronchiectasis, severe pulmonary oedema, bronchitis with secretions |
| Type | Character | Timing | Pitch | Causes |
|---|---|---|---|---|
| Sibilant rhonchi (wheezes) | High-pitched, hissing/squeaking ("squeaky door") | Mainly expiratory | High | Asthma, bronchospasm, small airway obstruction |
| Sonorous rhonchi | Low-pitched, snoring/moaning | Inspiratory or expiratory | Low | Large airway secretions, chronic bronchitis, COPD |
| Sign | Method | Normal | Abnormal finding | Meaning |
|---|---|---|---|---|
| Vocal resonance | Patient says "ninety-nine"; auscultate | Muffled, indistinct | Increased (clear) | Consolidation |
| Decreased/absent | Effusion, pneumothorax | |||
| Bronchophony | Same as above | Indistinct | Abnormally clear and loud "ninety-nine" | Consolidation |
| Whispering pectoriloquy | Patient whispers "one-two-three"; auscultate | Barely audible | Clearly heard whispered words | Consolidation (most sensitive sign) |
| Aegophony (Egophony) | Patient says "E"; auscultate | Hear "E" | Hear "A" (nasal bleating quality) | Just above pleural effusion (compressed lung) |
| Condition | Breath Sounds | Added Sounds | Vocal Resonance |
|---|---|---|---|
| Consolidation | Bronchial (tubular) | Fine/medium crepitations | Increased, bronchophony, whispering pectoriloquy |
| Pleural effusion | Absent/reduced; bronchial just above | Pleural rub (early) | Absent below; aegophony at upper border |
| Pneumothorax | Absent/reduced | Absent | Absent/reduced |
| Emphysema | Vesicular, reduced | None or fine crackles | Reduced |
| Asthma (acute) | Vesicular + prolonged expiration | Polyphonic sibilant rhonchi | Normal/reduced |
| Pulmonary fibrosis | Vesicular | Bilateral fine end-insp. crepitations ("Velcro") | Normal |
| Pleural effusion (above) | Bronchial (compressed lung) | Aegophony | Increased just above fluid |
| Lung abscess | Cavernous/amphoric | Coarse crepitations | Increased over cavity |
Make a presentation on physical examination skills in respiratory assessment
mkdir -p /home/daytona/workspace/resp-exam-pptx
~/resp-exam-pptx/build.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Physical Examination Skills in Respiratory Assessment";
pres.author = "Medical Education";
// ─── COLOUR PALETTE ───────────────────────────────────────────────────────────
const C = {
navy: "0B2545", // dominant dark (60%)
teal: "14517C", // supporting mid
sky: "1B7AC4", // accent blue
mint: "00B4A6", // accent teal/green
white: "FFFFFF",
offWht: "F0F4F8",
pale: "D6EAF8",
gold: "F4C542",
lightGr: "E8F5F3",
text: "1A1A2E",
subtext: "4A6580",
};
// ─── HELPERS ──────────────────────────────────────────────────────────────────
function addBg(slide, color) {
slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 5.625, fill: { color } });
}
function addAccentBar(slide, color = C.mint) {
slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 5.25, w: 10, h: 0.375, fill: { color } });
}
function sectionTitle(slide, title, sub) {
addBg(slide, C.navy);
// Decorative circle left
slide.addShape(pres.shapes.OVAL, { x: -0.8, y: -0.8, w: 3, h: 3, fill: { color: C.teal, transparency: 60 }, line: { type: "none" } });
// Decorative circle right
slide.addShape(pres.shapes.OVAL, { x: 8.5, y: 3.5, w: 2.5, h: 2.5, fill: { color: C.mint, transparency: 70 }, line: { type: "none" } });
// Accent horizontal line
slide.addShape(pres.shapes.RECTANGLE, { x: 0.6, y: 2.85, w: 1.2, h: 0.07, fill: { color: C.gold }, line: { type: "none" } });
slide.addText(title, { x: 0.6, y: 1.7, w: 8.8, h: 0.9, fontSize: 36, bold: true, color: C.white, fontFace: "Calibri" });
if (sub) slide.addText(sub, { x: 0.6, y: 2.95, w: 8.8, h: 0.5, fontSize: 17, color: C.pale, fontFace: "Calibri", italic: true });
}
function contentHeader(slide, title, color = C.navy) {
slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 0.85, fill: { color } });
slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0.85, w: 10, h: 0.05, fill: { color: C.mint } });
slide.addText(title, { x: 0.35, y: 0.1, w: 9.3, h: 0.65, fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
}
function bulletBox(slide, items, x, y, w, h, opts = {}) {
const textArr = items.map((item, i) => ({
text: item,
options: { bullet: { type: "bullet", indent: 15 }, breakLine: i < items.length - 1, fontSize: opts.fontSize || 13.5, color: opts.color || C.text, fontFace: "Calibri" }
}));
slide.addText(textArr, { x, y, w, h, valign: "top", margin: [4, 6, 4, 6] });
}
function card(slide, x, y, w, h, fillColor, lineColor) {
slide.addShape(pres.shapes.ROUNDED_RECTANGLE, {
x, y, w, h,
fill: { color: fillColor || C.offWht },
line: { color: lineColor || C.sky, width: 1.5 },
rectRadius: 0.1,
shadow: { type: "outer", color: "000000", blur: 5, offset: 2, angle: 135, opacity: 0.1 }
});
}
function footerLine(slide, label = "") {
slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 5.38, w: 10, h: 0.245, fill: { color: C.navy } });
if (label) {
slide.addText(label, { x: 0.3, y: 5.38, w: 9.5, h: 0.245, fontSize: 9, color: C.pale, fontFace: "Calibri", valign: "middle", margin: 0 });
}
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 1 – TITLE
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.navy);
// Large background geometric shapes
s.addShape(pres.shapes.OVAL, { x: 6.5, y: -1.5, w: 5.5, h: 5.5, fill: { color: C.teal, transparency: 65 }, line: { type: "none" } });
s.addShape(pres.shapes.OVAL, { x: -1.2, y: 3.5, w: 4, h: 4, fill: { color: C.sky, transparency: 75 }, line: { type: "none" } });
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 5.0, w: 10, h: 0.625, fill: { color: C.mint } });
// Title text
s.addText("Physical Examination Skills", {
x: 0.6, y: 1.1, w: 8.8, h: 0.9,
fontSize: 34, bold: true, color: C.white, fontFace: "Calibri", charSpacing: 1
});
s.addText("in Respiratory Assessment", {
x: 0.6, y: 1.95, w: 8.8, h: 0.75,
fontSize: 28, color: C.gold, fontFace: "Calibri", bold: false, charSpacing: 1
});
// Divider
s.addShape(pres.shapes.RECTANGLE, { x: 0.6, y: 2.82, w: 3.5, h: 0.06, fill: { color: C.mint }, line: { type: "none" } });
s.addText("A Comprehensive Guide for Medical Students", {
x: 0.6, y: 3.0, w: 8.8, h: 0.45,
fontSize: 14, color: C.pale, fontFace: "Calibri", italic: true
});
s.addText("Inspection • Palpation • Percussion • Auscultation", {
x: 0.6, y: 3.55, w: 8.8, h: 0.4,
fontSize: 12, color: C.mint, fontFace: "Calibri"
});
s.addText("Physical Examination Skills – Respiratory Assessment", {
x: 0.3, y: 5.02, w: 9.5, h: 0.35, fontSize: 9, color: C.navy, fontFace: "Calibri", valign: "middle", margin: 0
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 2 – OVERVIEW / TABLE OF CONTENTS
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offWht);
contentHeader(s, "Overview of Respiratory Physical Examination");
footerLine(s, "Physical Examination Skills – Respiratory Assessment");
const steps = [
["01", "General Inspection", "Breathing pattern, cyanosis, clubbing, shape of chest"],
["02", "Inspection of the Chest", "Static & dynamic deformities, respiratory movements"],
["03", "Palpation", "Tracheal position, chest expansion, tactile vocal fremitus"],
["04", "Percussion", "Resonant, dull, stony dull, hyper-resonant, tympanitic"],
["05", "Auscultation – Breath Sounds", "Vesicular, bronchial, bronchovesicular types"],
["06", "Auscultation – Added Sounds", "Crepitations, rhonchi, pleural rub, stridor"],
["07", "Vocal Resonance", "Bronchophony, whispering pectoriloquy, aegophony"],
["08", "Common Conditions at a Glance", "Consolidated findings for key diagnoses"],
];
const rowH = 0.52;
const startY = 1.0;
steps.forEach(([num, title, desc], i) => {
const y = startY + i * rowH;
const bg = i % 2 === 0 ? C.white : C.pale;
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y, w: 9.3, h: rowH - 0.04, fill: { color: bg }, line: { type: "none" } });
// number badge
s.addShape(pres.shapes.OVAL, { x: 0.38, y: y + 0.07, w: 0.38, h: 0.38, fill: { color: C.sky }, line: { type: "none" } });
s.addText(num, { x: 0.38, y: y + 0.07, w: 0.38, h: 0.38, fontSize: 8.5, bold: true, color: C.white, align: "center", valign: "middle", fontFace: "Calibri", margin: 0 });
s.addText(title, { x: 0.84, y: y + 0.04, w: 2.8, h: 0.22, fontSize: 12, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addText(desc, { x: 0.84, y: y + 0.26, w: 8.5, h: 0.2, fontSize: 10, color: C.subtext, fontFace: "Calibri", margin: 0 });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 3 – GENERAL INSPECTION
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offWht);
contentHeader(s, "Step 1 — General Inspection");
footerLine(s, "Physical Examination Skills – Respiratory Assessment");
// Left column
card(s, 0.35, 1.0, 4.3, 2.0, C.white, C.sky);
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 1.0, w: 4.3, h: 0.38, fill: { color: C.sky }, line: { type: "none" } });
s.addText("Breathing Pattern", { x: 0.45, y: 1.0, w: 4.1, h: 0.38, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
bulletBox(s, [
"Rate: Normal 12–20/min",
"Tachypnoea (>20) / Bradypnoea (<12)",
"Cheyne-Stokes: crescendo-decrescendo cycles + apnoea",
"Kussmaul: deep, rapid (metabolic acidosis)",
"Biot's: irregular with apnoea (raised ICP)",
], 0.45, 1.42, 4.1, 1.5, { fontSize: 12 });
// Right column
card(s, 4.85, 1.0, 4.8, 2.0, C.white, C.mint);
s.addShape(pres.shapes.RECTANGLE, { x: 4.85, y: 1.0, w: 4.8, h: 0.38, fill: { color: C.mint }, line: { type: "none" } });
s.addText("Peripheral Signs", { x: 4.95, y: 1.0, w: 4.6, h: 0.38, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
bulletBox(s, [
"Cyanosis — Central (tongue) vs Peripheral",
"Clubbing — respiratory causes: fibrosis, Ca, empyema",
"Flap (asterixis) — CO₂ retention (type 2 RF)",
"Nicotine staining / tar deposits on fingers",
"JVP — raised in cor pulmonale / SVC obstruction",
], 4.95, 1.42, 4.6, 1.5, { fontSize: 12 });
// Bottom row
card(s, 0.35, 3.15, 9.3, 1.85, C.white, C.teal);
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 3.15, w: 9.3, h: 0.38, fill: { color: C.teal }, line: { type: "none" } });
s.addText("Other General Inspection Points", { x: 0.45, y: 3.15, w: 9.1, h: 0.38, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
const row3 = [
"Facial appearance (Horner's syndrome — ptosis, miosis, anhydrosis)",
"Voice: hoarseness (recurrent laryngeal nerve palsy, malignancy)",
"Sputum pot: character of sputum (mucoid, purulent, blood-stained, rusty)",
"Inhalers / O₂ at bedside — clue to underlying condition",
];
const rowTextArr3 = row3.map((t, i) => ({
text: t,
options: { bullet: { type: "bullet", indent: 15 }, breakLine: i < row3.length - 1, fontSize: 12, color: C.text, fontFace: "Calibri" }
}));
s.addText(rowTextArr3, { x: 0.5, y: 3.58, w: 9.1, h: 1.3, valign: "top", margin: [2, 6, 2, 6] });
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 4 – CHEST INSPECTION
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offWht);
contentHeader(s, "Step 2 — Inspection of the Chest");
footerLine(s, "Physical Examination Skills – Respiratory Assessment");
// Static deformities
card(s, 0.35, 1.0, 4.3, 2.25, C.white, C.sky);
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 1.0, w: 4.3, h: 0.38, fill: { color: C.sky }, line: { type: "none" } });
s.addText("Static (Structural) Deformities", { x: 0.45, y: 1.0, w: 4.1, h: 0.38, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
bulletBox(s, [
"Barrel chest — COPD/emphysema (↑ AP diameter, Hoover's sign)",
"Pectus excavatum — funnel chest (depressed sternum)",
"Pectus carinatum — pigeon chest (forward sternum)",
"Harrison's sulcus — childhood asthma/rickets",
"Kyphosis/Scoliosis — restrictive lung disease",
"Gibbus deformity — TB of spine",
], 0.45, 1.42, 4.1, 1.75, { fontSize: 11.5 });
// Dynamic movements
card(s, 4.85, 1.0, 4.8, 2.25, C.white, C.mint);
s.addShape(pres.shapes.RECTANGLE, { x: 4.85, y: 1.0, w: 4.8, h: 0.38, fill: { color: C.mint }, line: { type: "none" } });
s.addText("Dynamic (Movement) Observations", { x: 4.95, y: 1.0, w: 4.6, h: 0.38, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
bulletBox(s, [
"Symmetry of chest movement",
"Unilateral lagging — pneumonia, effusion, collapse, fibrosis",
"Use of accessory muscles (SCM, scalene, trapezius) — respiratory distress",
"Intercostal recession — airway obstruction / children",
"Subcostal recession — severe distress",
"Paradoxical movement — flail chest (multiple rib fractures)",
], 4.95, 1.42, 4.6, 1.75, { fontSize: 11.5 });
// Bottom note
card(s, 0.35, 3.4, 9.3, 1.65, C.lightGr, C.teal);
s.addText("KEY CLINICAL TIP", { x: 0.55, y: 3.5, w: 2.5, h: 0.32, fontSize: 11, bold: true, color: C.teal, fontFace: "Calibri", margin: 0 });
s.addText(
"Always inspect the chest from the end of the bed FIRST before moving closer. " +
"Observe anterior chest, lateral aspects, and posterior chest systematically. " +
"Note any skin changes — scars (previous surgery, drain sites), dilated veins (SVC obstruction), skin lesions (neurofibromatosis), " +
"and chest wall asymmetry at rest and during breathing.",
{ x: 0.55, y: 3.85, w: 9.0, h: 1.1, fontSize: 12, color: C.text, fontFace: "Calibri" }
);
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 5 – PALPATION
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offWht);
contentHeader(s, "Step 3 — Palpation");
footerLine(s, "Physical Examination Skills – Respiratory Assessment");
// 3 cards in a row
const items3 = [
{
title: "Tracheal Position",
color: C.sky,
bullets: [
"Index finger in suprasternal notch",
"Central = normal",
"Displaced TOWARDS lesion: collapse, fibrosis",
"Displaced AWAY from lesion: tension pneumothorax, large effusion",
"Check cricosternal distance (≥3 finger-widths normal)",
]
},
{
title: "Chest Expansion",
color: C.teal,
bullets: [
"Hands flat on posterior chest, thumbs raised horizontally",
"Ask patient to take deep breath",
"Thumbs move ≥5 cm bilaterally = normal",
"Reduced bilaterally: COPD, fibrosis, bilateral consolidation",
"Reduced unilaterally: effusion, collapse, pneumothorax, consolidation",
"Repeat anteriorly (apices) and at base",
]
},
{
title: "Vocal / Tactile Fremitus",
color: C.mint,
bullets: [
"Ulnar edge of hand on chest wall",
"Ask patient to say 'ninety-nine' / '99'",
"Normal: vibration transmitted to hand",
"Increased: consolidation (solid conducts better)",
"Decreased: effusion, pneumothorax, thick chest wall, pleural thickening",
"Absent: large effusion, complete pneumothorax",
]
},
];
items3.forEach(({ title, color, bullets }, i) => {
const x = 0.28 + i * 3.2;
card(s, x, 1.0, 3.1, 4.08, C.white, color);
s.addShape(pres.shapes.RECTANGLE, { x, y: 1.0, w: 3.1, h: 0.38, fill: { color }, line: { type: "none" } });
s.addText(title, { x: x + 0.1, y: 1.0, w: 2.9, h: 0.38, fontSize: 12.5, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
bulletBox(s, bullets, x + 0.15, 1.42, 2.85, 3.5, { fontSize: 11 });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 6 – PERCUSSION
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offWht);
contentHeader(s, "Step 4 — Percussion");
footerLine(s, "Physical Examination Skills – Respiratory Assessment");
// Technique box
card(s, 0.35, 1.0, 3.5, 1.35, C.white, C.sky);
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 1.0, w: 3.5, h: 0.34, fill: { color: C.sky }, line: { type: "none" } });
s.addText("Technique", { x: 0.45, y: 1.0, w: 3.3, h: 0.34, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
bulletBox(s, [
"Place middle finger (pleximeter) firmly on chest",
"Strike middle phalanx with middle finger of other hand",
"Strike with wrist movement — 2 quick strokes",
"Compare side-to-side at each level",
], 0.45, 1.38, 3.3, 0.9, { fontSize: 11.5 });
// Table of percussion notes
const notes = [
["Note", "Quality", "Conditions", "Colour"],
["Resonant", "Hollow, drum-like", "Normal lung", C.sky],
["Dull", "Thud-like, short", "Consolidation, lung collapse, pleural thickening", C.teal],
["Stony Dull", "Extremely flat/dull", "Pleural effusion (most dull)", "2C5F7E"],
["Hyper-resonant", "Loud, booming, prolonged", "Pneumothorax, emphysema, large bulla", "1A8A6B"],
["Tympanitic", "Drum-like, very high pitched", "Large pneumothorax (with open communication), Traube's space", C.gold],
];
const tblW = 9.3;
const tblX = 0.35;
const startY = 2.45;
const rowH = 0.525;
notes.forEach(([note, quality, condition, color], i) => {
const y = startY + i * rowH;
const bg = i === 0 ? C.navy : i % 2 === 0 ? C.pale : C.white;
s.addShape(pres.shapes.RECTANGLE, { x: tblX, y, w: tblW, h: rowH, fill: { color: bg }, line: { type: "none" } });
if (i > 0) {
s.addShape(pres.shapes.RECTANGLE, { x: tblX + 0.08, y: y + 0.13, w: 0.2, h: 0.25, fill: { color }, line: { type: "none" } });
}
const colXs = [0.45, 2.15, 3.85];
const colWs = [1.55, 1.6, 5.5];
const colValues = i === 0 ? [note, quality, condition] : [note, quality, condition];
colValues.forEach((val, j) => {
s.addText(val, {
x: tblX + colXs[j], y: y + 0.04,
w: colWs[j], h: rowH - 0.08,
fontSize: i === 0 ? 11.5 : 11,
bold: i === 0,
color: i === 0 ? C.white : C.text,
fontFace: "Calibri",
valign: "middle", margin: 0,
wrap: true,
});
});
});
// Special percussion signs note
s.addText("Special Signs: Traube's space (L lower chest) — normally resonant; dull = splenomegaly / large left effusion. Bird-dull area = liver dullness starts at 5th ICS (R).", {
x: 0.35, y: 5.1, w: 9.3, h: 0.3, fontSize: 9.5, color: C.subtext, fontFace: "Calibri", italic: true
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 7 – AUSCULTATION INTRO + TECHNIQUE
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offWht);
contentHeader(s, "Step 5 — Auscultation: Technique & Normal Sounds");
footerLine(s, "Physical Examination Skills – Respiratory Assessment");
// Technique
card(s, 0.35, 1.0, 4.55, 2.1, C.white, C.sky);
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 1.0, w: 4.55, h: 0.38, fill: { color: C.sky }, line: { type: "none" } });
s.addText("Technique", { x: 0.45, y: 1.0, w: 4.35, h: 0.38, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
bulletBox(s, [
"Use diaphragm of stethoscope (directly on skin)",
"Patient breathes deeply through open mouth",
"Auscultate apex to base, comparing side-to-side",
"Listen both anteriorly AND posteriorly",
"Include axillary regions (RML, Lingula)",
"Listen for at least one full breath at each site",
"Note: quality, intensity, timing (insp/exp), any added sounds",
], 0.45, 1.42, 4.35, 1.6, { fontSize: 11.5 });
// Normal sounds table
const tableData = [
["Sound", "Site", "Character", "I:E Ratio"],
["Vesicular\n(Normal)", "Peripheral lung fields", "Soft, low-pitched rustling; insp > exp; no gap", "3:1"],
["Bronchovesicular", "1st/2nd ICS anteriorly;\nBetween scapulae", "Intermediate; medium pitch; insp ≈ exp; short gap", "1:1"],
["Bronchial\n(Tubular)", "Over trachea &\nmanubrium sterni", "Loud, high-pitched, hollow; exp > insp; gap between insp & exp", "1:2"],
["Tracheal", "Suprasternal notch\nover trachea", "Loud, harsh; heard both phases equally; broadest frequency range", "1:1"],
];
const colXs = [4.98, 6.0, 7.3, 9.45];
const colWs = [0.95, 1.25, 2.1, 0.6];
const tblY = 1.0;
const rowH = 0.68;
tableData.forEach(([c0, c1, c2, c3], i) => {
const y = tblY + i * rowH;
const bg = i === 0 ? C.navy : i % 2 === 0 ? C.pale : C.white;
s.addShape(pres.shapes.RECTANGLE, { x: 4.9, y, w: 4.8, h: rowH, fill: { color: bg }, line: { type: "none" } });
[[c0, 4.98, 0.95], [c1, 5.97, 1.28], [c2, 7.28, 2.12], [c3, 9.44, 0.5]].forEach(([txt, x, w]) => {
s.addText(txt, {
x, y: y + 0.03, w, h: rowH - 0.06,
fontSize: i === 0 ? 10.5 : 10, bold: i === 0,
color: i === 0 ? C.white : C.text,
fontFace: "Calibri", valign: "middle", wrap: true, margin: [2, 3, 2, 3]
});
});
});
// Differential note
card(s, 0.35, 3.18, 9.3, 1.5, C.lightGr, C.teal);
s.addText("Abnormal Bronchial Breathing (in Peripheral Sites)", {
x: 0.5, y: 3.22, w: 9.0, h: 0.3, fontSize: 12, bold: true, color: C.teal, fontFace: "Calibri", margin: 0
});
const abnormalB = [
"Tubular — consolidation (lobar pneumonia)",
"Cavernous — lung abscess / large TB cavity (louder, lower, more hollow)",
"Amphoric — large smooth-walled cavity / bronchopleural fistula (metallic, 'blowing over bottle')",
];
bulletBox(s, abnormalB, 0.5, 3.56, 9.0, 1.05, { fontSize: 11.5, color: C.text });
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 8 – QUANTITATIVE CHANGES IN BREATH SOUNDS
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offWht);
contentHeader(s, "Auscultation — Quantitative Changes in Breath Sounds");
footerLine(s, "Physical Examination Skills – Respiratory Assessment");
const qCards = [
{
title: "Diminished / Reduced",
color: C.teal,
items: [
"Pleural effusion — fluid absorbs sound",
"Pneumothorax — air in pleural space",
"Emphysema — air trapping, reduced airflow",
"Obesity / thick chest wall",
"Bronchial obstruction (tumour, mucus plug)",
"Pleural thickening"
]
},
{
title: "Absent",
color: "B03A2E",
items: [
"Large pleural effusion",
"Complete pneumothorax",
"Complete bronchial obstruction",
"Post-pneumonectomy"
]
},
{
title: "Increased / Accentuated",
color: "1A8A6B",
items: [
"Over compressed lung above effusion",
"Compensatory areas adjacent to collapse",
"Note: usually heard as bronchial breathing, not just 'louder vesicular'"
]
}
];
qCards.forEach(({ title, color, items }, i) => {
const x = 0.28 + i * 3.2;
card(s, x, 1.0, 3.1, 2.6, C.white, color);
s.addShape(pres.shapes.RECTANGLE, { x, y: 1.0, w: 3.1, h: 0.38, fill: { color }, line: { type: "none" } });
s.addText(title, { x: x + 0.1, y: 1.0, w: 2.9, h: 0.38, fontSize: 12.5, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
bulletBox(s, items, x + 0.12, 1.42, 2.85, 2.1, { fontSize: 11 });
});
// Reminder box
card(s, 0.35, 3.75, 9.3, 1.52, C.white, C.gold);
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 3.75, w: 9.3, h: 0.34, fill: { color: "B8860B" }, line: { type: "none" } });
s.addText("Memory Aid — Causes of Reduced / Absent Breath Sounds", {
x: 0.45, y: 3.75, w: 9.1, h: 0.34, fontSize: 12, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0
});
s.addText(
"POET: P — Pneumothorax / Pleural effusion / Pleural thickening\n" +
" O — Obesity / thick chest wall\n" +
" E — Emphysema (COPD)\n" +
" T — Tumour blocking bronchus (also Tracheobronchial obstruction)",
{ x: 0.5, y: 4.12, w: 9.0, h: 1.0, fontSize: 11.5, color: C.text, fontFace: "Calibri", valign: "top" }
);
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 9 – ADDED SOUNDS: CREPITATIONS
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offWht);
contentHeader(s, "Auscultation — Added Sounds: Crepitations (Crackles / Rales)");
footerLine(s, "Physical Examination Skills – Respiratory Assessment");
s.addText("Non-continuous, interrupted, explosive sounds. Mechanism: sudden opening of collapsed small airways / alveoli OR movement of secretions.", {
x: 0.35, y: 0.95, w: 9.3, h: 0.38, fontSize: 11.5, color: C.subtext, fontFace: "Calibri", italic: true
});
const creps = [
{
type: "Fine Crepitations",
char: "Soft, high-pitched, short\n'Rubbing hair near ear' / Velcro-like",
timing: "Late inspiratory",
clears: "Do NOT clear with cough",
causes: "Pulmonary fibrosis (IPF), early pulmonary oedema, atelectasis",
color: C.sky
},
{
type: "Medium Crepitations",
char: "Medium pitch, medium duration",
timing: "Mid-inspiratory",
clears: "May partially clear with cough",
causes: "Bronchiectasis, resolving pneumonia, pulmonary oedema",
color: C.teal
},
{
type: "Coarse Crepitations",
char: "Loud, low-pitched, bubbling\n'Fluid in airway' quality",
timing: "Early inspiratory or expiratory",
clears: "Clear or change with coughing",
causes: "Severe pulmonary oedema, bronchiectasis, bronchitis with secretions, lung abscess",
color: "2C5F7E"
}
];
creps.forEach(({ type, char, timing, clears, causes, color }, i) => {
const y = 1.42 + i * 1.27;
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y, w: 9.3, h: 1.18, fill: { color: i % 2 === 0 ? C.pale : C.white }, line: { type: "none" } });
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y, w: 0.18, h: 1.18, fill: { color }, line: { type: "none" } });
s.addText(type, { x: 0.62, y: y + 0.06, w: 2.3, h: 0.3, fontSize: 12.5, bold: true, color, fontFace: "Calibri", margin: 0 });
s.addText(char, { x: 0.62, y: y + 0.36, w: 2.3, h: 0.7, fontSize: 10.5, color: C.text, fontFace: "Calibri", wrap: true });
s.addText("Timing: " + timing, { x: 3.1, y: y + 0.1, w: 2.1, h: 0.28, fontSize: 11, color: C.subtext, fontFace: "Calibri", margin: 0 });
s.addText(clears, { x: 3.1, y: y + 0.42, w: 2.1, h: 0.56, fontSize: 11, color: "B03A2E", fontFace: "Calibri", bold: true, wrap: true });
s.addText("Causes: " + causes, { x: 5.35, y: y + 0.1, w: 4.15, h: 1.0, fontSize: 11, color: C.text, fontFace: "Calibri", wrap: true });
});
// Tip
s.addText("TIP: Fine late-inspiratory crackles that don't clear with coughing = alveolar/interstitial pathology. Coarse early crackles that clear = secretions in large airways.", {
x: 0.35, y: 5.08, w: 9.3, h: 0.28, fontSize: 9.5, color: C.teal, fontFace: "Calibri", italic: true
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 10 – RHONCHI, STRIDOR, PLEURAL RUB
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offWht);
contentHeader(s, "Auscultation — Added Sounds: Rhonchi, Stridor & Pleural Rub");
footerLine(s, "Physical Examination Skills – Respiratory Assessment");
// Rhonchi
card(s, 0.35, 1.0, 9.3, 1.65, C.white, C.sky);
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 1.0, w: 9.3, h: 0.36, fill: { color: C.sky }, line: { type: "none" } });
s.addText("Rhonchi (Wheezes) — Continuous Musical Sounds (>250 ms)", {
x: 0.45, y: 1.0, w: 9.1, h: 0.36, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0
});
// Two sub-boxes
s.addText([
{ text: "Sibilant Rhonchi (High-Pitched Wheeze)\n", options: { bold: true, fontSize: 12, color: C.sky, breakLine: false } },
{ text: " • High-pitched, hissing/squeaking, 'squeaky door'\n", options: { fontSize: 11, color: C.text, breakLine: false } },
{ text: " • Mainly expiratory; prolonged expiration\n", options: { fontSize: 11, color: C.text, breakLine: false } },
{ text: " • Polyphonic (multiple pitches) = diffuse airways disease (asthma)\n", options: { fontSize: 11, color: C.text, breakLine: false } },
{ text: " • Monophonic (single pitch) = localised obstruction (tumour, FB)", options: { fontSize: 11, color: C.text } },
], { x: 0.45, y: 1.4, w: 4.2, h: 1.2, valign: "top", wrap: true });
s.addShape(pres.shapes.RECTANGLE, { x: 4.85, y: 1.04, w: 0.02, h: 1.55, fill: { color: C.pale }, line: { type: "none" } });
s.addText([
{ text: "Sonorous Rhonchi (Low-Pitched Wheeze / Rhonchus)\n", options: { bold: true, fontSize: 12, color: C.teal, breakLine: false } },
{ text: " • Low-pitched, snoring/moaning quality\n", options: { fontSize: 11, color: C.text, breakLine: false } },
{ text: " • Inspiratory or expiratory\n", options: { fontSize: 11, color: C.text, breakLine: false } },
{ text: " • Caused by secretions in large airways\n", options: { fontSize: 11, color: C.text, breakLine: false } },
{ text: " • Causes: COPD, chronic bronchitis, mucus plugging", options: { fontSize: 11, color: C.text } },
], { x: 4.95, y: 1.4, w: 4.55, h: 1.2, valign: "top", wrap: true });
// Stridor
card(s, 0.35, 2.78, 4.55, 1.55, C.white, "B03A2E");
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 2.78, w: 4.55, h: 0.36, fill: { color: "B03A2E" }, line: { type: "none" } });
s.addText("Stridor — URGENT !", {
x: 0.45, y: 2.78, w: 4.35, h: 0.36, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0
});
bulletBox(s, [
"Loud, harsh, high-pitched, mainly INSPIRATORY",
"Upper airway obstruction (extrathoracic)",
"Best heard over trachea / neck",
"Causes: epiglottitis, croup, foreign body, laryngeal oedema, tracheal tumour, anaphylaxis",
"URGENT — assess airway immediately",
], 0.45, 3.18, 4.35, 1.1, { fontSize: 11 });
// Pleural rub
card(s, 5.05, 2.78, 4.6, 1.55, C.white, C.teal);
s.addShape(pres.shapes.RECTANGLE, { x: 5.05, y: 2.78, w: 4.6, h: 0.36, fill: { color: C.teal }, line: { type: "none" } });
s.addText("Pleural Friction Rub", {
x: 5.15, y: 2.78, w: 4.4, h: 0.36, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0
});
bulletBox(s, [
"Creaking, leathery, 'walking on snow' / rubbing leather",
"Both inspiratory AND expiratory",
"Disappears when breath is held (vs pericardial rub)",
"Best heard: lower lateral chest",
"Causes: pleurisy (infection, PE, malignancy, TB)",
], 5.15, 3.18, 4.4, 1.1, { fontSize: 11 });
// Causes of wheeze mnemonic
s.addText("Causes of Wheeze: ABCDE — Asthma, Bronchitis (COPD), Cardiac (LVF / cardiac asthma), D = Foreign body, E = Endobronchial tumour / extrinsic compression", {
x: 0.35, y: 4.42, w: 9.3, h: 0.42, fontSize: 10.5, color: C.subtext, fontFace: "Calibri", italic: true
});
footerLine(s, "Physical Examination Skills – Respiratory Assessment");
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 11 – VOCAL RESONANCE
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offWht);
contentHeader(s, "Step 6 — Vocal Resonance (Voice Sounds)");
footerLine(s, "Physical Examination Skills – Respiratory Assessment");
s.addText("The patient phonates while you auscultate — changes in transmitted voice sounds give diagnostic clues.", {
x: 0.35, y: 0.95, w: 9.3, h: 0.35, fontSize: 11.5, color: C.subtext, fontFace: "Calibri", italic: true
});
const vrData = [
["Sign", "Instruction to Patient", "Normal Finding", "Abnormal Finding", "Interpretation"],
["Vocal Resonance", "Say 'ninety-nine' repeatedly", "Muffled, indistinct words", "Clear/loud (increased) words", "Increased: consolidation\nDecreased: effusion, pneumothorax"],
["Bronchophony", "Say 'ninety-nine' loudly", "Words muffled, indistinct", "Loud, clear 'ninety-nine'", "Consolidation (solid lung transmits voice well)"],
["Whispering\nPectoriloquy", "Whisper 'one-two-three'", "Barely audible / inaudible", "Clearly heard whispered words", "Consolidation (MOST sensitive sign of consolidation)"],
["Aegophony\n(Egophony)", "Say 'E' (eee)", "Hear 'E' — same as said", "Hear 'A' (nasal, bleating quality)", "Compressed lung just above pleural effusion"],
];
const tblX = 0.35;
const tblY = 1.38;
const rowH = 0.74;
const colWs = [1.5, 2.0, 1.6, 1.85, 2.0];
const colStarts = [0.38, 1.92, 3.96, 5.6, 7.5];
vrData.forEach((row, i) => {
const y = tblY + i * rowH;
const bg = i === 0 ? C.navy : i % 2 === 0 ? C.pale : C.white;
s.addShape(pres.shapes.RECTANGLE, { x: tblX, y, w: 9.3, h: rowH, fill: { color: bg }, line: { type: "none" } });
row.forEach((cell, j) => {
s.addText(cell, {
x: colStarts[j], y: y + 0.04, w: colWs[j], h: rowH - 0.08,
fontSize: i === 0 ? 10.5 : 10.5, bold: i === 0,
color: i === 0 ? C.white : (j === 4 ? C.teal : C.text),
fontFace: "Calibri", valign: "middle", wrap: true, margin: [2, 3, 2, 3]
});
});
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 12 – COMMON CONDITIONS SUMMARY TABLE
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offWht);
contentHeader(s, "Clinical Correlations — Examination Findings at a Glance");
footerLine(s, "Physical Examination Skills – Respiratory Assessment");
const data = [
["Condition", "Trachea", "Expansion", "Percussion", "Breath Sounds", "Added Sounds", "Vocal Res."],
["Consolidation", "Central", "Reduced (ipsi)", "Dull", "Bronchial (tubular)", "Fine/med crepitations", "↑ Bronchophony, WP"],
["Pleural Effusion", "Central / away (large)", "Reduced (ipsi)", "Stony dull", "Absent/reduced; bronchial above", "Pleural rub (early)", "Absent; aegophony at top"],
["Pneumothorax", "Away (tension)", "Reduced (ipsi)", "Hyper-resonant", "Absent/reduced", "None", "Absent/reduced"],
["Emphysema\n(COPD)", "Central", "Reduced (bilat)", "Hyper-resonant", "Vesicular, reduced; prolong. exp.", "Rhonchi ± crepitations", "Reduced"],
["Asthma (acute)", "Central", "Reduced (bilat)", "Hyper-resonant", "Vesicular + prolong. exp.", "Polyphonic sibilant rhonchi", "Normal / reduced"],
["Fibrosis (IPF)", "Central", "Reduced (bilat)", "Dull", "Vesicular, reduced", "Bilateral fine late insp. creps (Velcro)", "Normal"],
["Collapse\n(Atelectasis)", "Towards (ipsi)", "Reduced (ipsi)", "Dull", "Reduced/absent (obstructive)", "None typically", "Reduced"],
["Lung Abscess", "Central", "Reduced (ipsi)", "Dull (or tympanitic over cavity)", "Cavernous / amphoric", "Coarse crepitations", "Increased over cavity"],
];
const tblX = 0.25;
const startY = 0.95;
const rH = 0.515;
const colXs = [0.28, 1.48, 2.36, 3.22, 4.12, 5.62, 7.25];
const colWs = [1.15, 0.84, 0.82, 0.86, 1.46, 1.58, 2.45];
data.forEach((row, i) => {
const y = startY + i * rH;
const bg = i === 0 ? C.navy : i % 2 === 0 ? C.pale : C.white;
s.addShape(pres.shapes.RECTANGLE, { x: tblX, y, w: 9.5, h: rH, fill: { color: bg }, line: { type: "none" } });
row.forEach((cell, j) => {
s.addText(cell, {
x: colXs[j], y: y + 0.02, w: colWs[j], h: rH - 0.04,
fontSize: i === 0 ? 9.5 : 9,
bold: i === 0 || j === 0,
color: i === 0 ? C.white : (j === 0 ? C.navy : C.text),
fontFace: "Calibri", valign: "middle", wrap: true, margin: [1, 2, 1, 2]
});
});
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 13 – SPECIAL TESTS & SIGNS
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offWht);
contentHeader(s, "Special Tests & Eponymous Signs in Respiratory Examination");
footerLine(s, "Physical Examination Skills – Respiratory Assessment");
const signs = [
{ name: "Hoover's Sign", color: C.sky, desc: "On deep inspiration, the lower ribs move inwards instead of outwards. Seen in severe COPD (barrel chest, flat diaphragm)." },
{ name: "Pemberton's Sign", color: C.teal, desc: "Arms raised above head for 1 min → facial plethora, cyanosis, JVD = superior mediastinal obstruction (retrosternal goitre, lymphoma)." },
{ name: "Hamman's Sign", color: C.mint, desc: "Mediastinal crunch — crackling sound synchronous with heartbeat (not respiration). Seen in pneumomediastinum." },
{ name: "Bouchut's Sign", color: "8E44AD", desc: "Tubular breathing heard over a consolidated area in a child; helps diagnose early pneumonia when percussion is equivocal." },
{ name: "Skodaic Resonance", color: "B03A2E", desc: "Hyper-resonance heard above a pleural effusion — due to compensatory over-inflation of the lobe above the fluid." },
{ name: "Coin Test (Bell Sound)", color: "B8860B", desc: "One coin held on chest wall, another struck against it; auscultate anteriorly — metallic note = pneumothorax. Now obsolete (replaced by US)." },
];
const cols = 2;
const rows = 3;
const cardW = 4.5;
const cardH = 1.3;
const startX = 0.35;
const startY = 1.0;
const gapX = 0.32;
const gapY = 0.18;
signs.forEach(({ name, color, desc }, i) => {
const col = i % cols;
const row = Math.floor(i / cols);
const x = startX + col * (cardW + gapX);
const y = startY + row * (cardH + gapY);
card(s, x, y, cardW, cardH, C.white, color);
s.addShape(pres.shapes.RECTANGLE, { x, y, w: 0.22, h: cardH, fill: { color }, line: { type: "none" } });
s.addText(name, { x: x + 0.3, y: y + 0.1, w: cardW - 0.4, h: 0.3, fontSize: 12.5, bold: true, color, fontFace: "Calibri", margin: 0 });
s.addText(desc, { x: x + 0.3, y: y + 0.42, w: cardW - 0.4, h: cardH - 0.48, fontSize: 10.5, color: C.text, fontFace: "Calibri", wrap: true });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 14 – SYSTEMATIC APPROACH / CHECKLIST
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offWht);
contentHeader(s, "Systematic Approach — Clinical Examination Checklist");
footerLine(s, "Physical Examination Skills – Respiratory Assessment");
// Two column checklist
const left = [
["INTRODUCTION & POSITIONING", [
"Wash hands, introduce self, consent",
"Patient sitting at 45° or upright",
"Adequate exposure (chest exposed)",
]],
["GENERAL INSPECTION (from end of bed)", [
"Breathing pattern, accessory muscles, recession",
"Cyanosis (central vs peripheral)",
"Nutritional status, build",
"Sputum pot, O₂, inhalers at bedside",
]],
["HANDS & ARMS", [
"Clubbing, cyanosis, flap (asterixis)",
"Nicotine staining, peripheral oedema",
"Pulse rate & rhythm (bounding = CO₂ retention)",
]],
["FACE & NECK", [
"Eyes: Horner's syndrome (Pancoast tumour)",
"Mouth: central cyanosis, mucosa",
"JVP elevation, tracheal position, LN",
]],
];
const right = [
["CHEST INSPECTION", [
"Shape (barrel, pigeon, funnel, scoliosis)",
"Symmetry, scars, dilated veins",
"Respiratory movements — symmetry, recession",
]],
["PALPATION", [
"Tracheal position (central / deviated)",
"Chest expansion (anterior & posterior)",
"Tactile vocal fremitus (TVF) bilaterally",
]],
["PERCUSSION", [
"Percuss all zones: apex, mid, base — bilateral",
"Note: resonant / dull / stony dull / hyper-resonant",
]],
["AUSCULTATION", [
"Breath sounds: type, intensity",
"Added sounds: crepitations, rhonchi, rub, stridor",
"Vocal resonance, bronchophony, WP, aegophony",
]],
];
const renderSection = (sections, xBase) => {
let y = 1.02;
sections.forEach(([heading, items]) => {
s.addShape(pres.shapes.RECTANGLE, { x: xBase, y, w: 4.35, h: 0.28, fill: { color: C.teal }, line: { type: "none" } });
s.addText(heading, { x: xBase + 0.1, y, w: 4.15, h: 0.28, fontSize: 9.5, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
y += 0.28;
items.forEach(item => {
s.addText([{ text: "✓ " + item, options: { bullet: false, fontSize: 10.5, color: C.text, fontFace: "Calibri" } }], {
x: xBase + 0.12, y, w: 4.2, h: 0.28, valign: "middle", margin: 0
});
y += 0.27;
});
y += 0.08;
});
};
renderSection(left, 0.3);
renderSection(right, 5.0);
// Divider
s.addShape(pres.shapes.RECTANGLE, { x: 4.88, y: 1.0, w: 0.025, h: 4.2, fill: { color: C.pale }, line: { type: "none" } });
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 15 – KEY TAKEAWAYS / CONCLUSION
// ══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.navy);
// Decorative elements
s.addShape(pres.shapes.OVAL, { x: 7.5, y: -1.0, w: 4, h: 4, fill: { color: C.teal, transparency: 65 }, line: { type: "none" } });
s.addShape(pres.shapes.OVAL, { x: -0.8, y: 3.5, w: 3.5, h: 3.5, fill: { color: C.mint, transparency: 72 }, line: { type: "none" } });
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 5.25, w: 10, h: 0.375, fill: { color: C.mint } });
s.addText("Key Takeaways", {
x: 0.6, y: 0.3, w: 8.8, h: 0.55,
fontSize: 28, bold: true, color: C.gold, fontFace: "Calibri"
});
s.addShape(pres.shapes.RECTANGLE, { x: 0.6, y: 0.9, w: 2.5, h: 0.05, fill: { color: C.mint }, line: { type: "none" } });
const takeaways = [
"Always follow the sequence: Inspection → Palpation → Percussion → Auscultation",
"Quantitative changes = intensity of breath sounds (reduced, absent, increased)",
"Qualitative changes = type of sound (vesicular → bronchial; character of added sounds)",
"Crepitations that clear with cough = secretions; those that don't = alveolar/interstitial disease",
"Tracheal deviation: towards lesion (collapse/fibrosis) or away (tension pneumothorax/large effusion)",
"Stony dullness on percussion is virtually diagnostic of pleural effusion",
"Whispering pectoriloquy is the most sensitive sign of consolidation",
"Aegophony (E→A change) indicates compressed lung just above a pleural effusion",
"Stridor = upper airway emergency — act immediately",
"Correlate all findings together before reaching a diagnosis — no single sign is pathognomonic",
];
takeaways.forEach((t, i) => {
const y = 1.08 + i * 0.405;
s.addShape(pres.shapes.OVAL, { x: 0.55, y: y + 0.07, w: 0.22, h: 0.22, fill: { color: C.mint }, line: { type: "none" } });
s.addText((i + 1).toString(), { x: 0.55, y: y + 0.07, w: 0.22, h: 0.22, fontSize: 8, bold: true, color: C.navy, fontFace: "Calibri", align: "center", valign: "middle", margin: 0 });
s.addText(t, { x: 0.85, y, w: 8.8, h: 0.38, fontSize: 12, color: C.pale, fontFace: "Calibri", valign: "middle" });
});
}
// ─── WRITE FILE ───────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/resp-exam-pptx/Respiratory_Physical_Examination.pptx" })
.then(() => console.log("Done: Respiratory_Physical_Examination.pptx"))
.catch(e => { console.error(e); process.exit(1); });
cd /home/daytona/workspace/resp-exam-pptx && node build.js 2>&1
ls -lh /home/daytona/workspace/resp-exam-pptx/
Respiratory Physical Examination
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Title slide |
| 2 | Overview / Table of Contents (8 topics with numbered badges) |
| 3 | General Inspection — Breathing patterns (Cheyne-Stokes, Kussmaul, Biot's) + Peripheral signs (cyanosis, clubbing, flap) |
| 4 | Chest Inspection — Static deformities (barrel, pectus, Harrison's sulcus) + Dynamic observations (lagging, recession, accessory muscles) |
| 5 | Palpation — Tracheal position, chest expansion technique, tactile vocal fremitus (with causes for each change) |
| 6 | Percussion — Table of all 5 notes (resonant, dull, stony dull, hyper-resonant, tympanitic) with causes and special signs |
| 7 | Auscultation: technique + normal breath sounds table (vesicular, bronchovesicular, bronchial, tracheal) with I:E ratios + abnormal bronchial breathing |
| 8 | Quantitative changes in breath sounds (reduced, absent, increased) + POET mnemonic |
| 9 | Crepitations — Fine, medium, coarse: character, timing, clears with cough, causes |
| 10 | Rhonchi (sibilant vs sonorous), Stridor (marked urgent), Pleural rub + ABCDE mnemonic for wheeze |
| 11 | Vocal resonance table — bronchophony, whispering pectoriloquy, aegophony |
| 12 | Comprehensive comparison table: 8 common conditions across all examination steps |
| 13 | Eponymous signs — Hoover's, Pemberton's, Hamman's, Skodaic resonance, Coin test |
| 14 | Systematic examination checklist (clinical OSCE-ready) |
| 15 | 10 Key Takeaways — numbered on dark slide |